1、1、 图论匹配4。1 二分图最大匹配(hungary 邻接表) /二分图最大匹配,hungary 算法,邻接表形式,复杂度 O(m*e)/返回最大匹配数,传入二分图大小 m,n 和邻接表 list(只需一边 )/match1,match2 返回一个最大匹配 ,未匹配顶点 match 值为-1#include #define MAXN 310#define _clr(x) memset(x,0xff,sizeof(int)*MAXN)struct edge_tint from,to;edge_t* next;int hungary(int m,int n,edge_t* list,int* ma
2、tch1,int* match2)int sMAXN,tMAXN,p,q,ret=0,i,j,k;edge_t* e;for (_clr(match1),_clr(match2),i=0;i=0)for (_clr(t),sp=q=0=i;pnext)if (tj=e-to=0;j=p)match2j=k=tj,p=match1k,match1k=j;return ret;4。2 二分图最大匹配(hungary 邻接阵) /二分图最大匹配,hungary 算法,邻接阵形式,复杂度 O(m*m*n)/返回最大匹配数,传入二分图大小 m,n 和邻接阵 mat,非零元素表示有边/match1,mat
3、ch2 返回一个最大匹配 ,未匹配顶点 match 值为-1#include #define MAXN 310#define _clr(x) memset(x,0xff,sizeof(int)*MAXN)int hungary(int m,int n,int matMAXN,int* match1,int* match2)int sMAXN,tMAXN,p,q,ret=0,i,j,k;for (_clr(match1),_clr(match2),i=0;i=0)for (_clr(t),sp=q=0=i;p=0;j=p)match2j=k=tj,p=match1k,match1k=j;retu
4、rn ret;4。3 二分图最大匹配(hungary 正向表)/二分图最大匹配,hungary 算法,正向表形式,复杂度 O(m*e)/返回最大匹配数,传入二分图大小 m,n 和正向表 list,buf(只需一边)/match1,match2 返回一个最大匹配 ,未匹配顶点 match 值为-1#include #define MAXN 310#define _clr(x) memset(x,0xff,sizeof(int)*MAXN)int hungary(int m,int n,int* list,int* buf,int* match1,int* match2)int sMAXN,tMA
5、XN,p,q,ret=0,i,j,k,l;for (_clr(match1),_clr(match2),i=0;i=0)for (_clr(t),sp=q=0=i;p=0;j=p)match2j=k=tj,p=match1k,match1k=j;return ret;4。4 二分图最佳匹配(kuhn_munkras 邻接阵)/二分图最佳匹配,kuhn munkras 算法,邻接阵形式,复杂度 O(m*m*n)/返回最佳匹配值,传入二分图大小 m,n 和邻接阵 mat,表示权值/match1,match2 返回一个最佳匹配 ,未匹配顶点 match 值为-1/一定注意 m#define MAXN
6、 310#define inf 1000000000#define _clr(x) memset(x,0xff,sizeof(int)*n)int kuhn_munkras(int m,int n,int matMAXN,int* match1,int* match2)int sMAXN,tMAXN,l1MAXN,l2MAXN,p,q,ret=0,i,j,k;for (i=0;il1i?matij:l1i;for (i=0;i=0;j=p)match2j=k=tj,p=match1k,match1k=j;if (match1inext)if (!vt=e-to)if (matcht=2;)if
7、 (matchi=0);return j/2;4。6 一般图匹配(邻接阵)/一般图最大匹配,邻接阵形式,复杂度 O(n3)/返回匹配顶点对数,match 返回匹配,未匹配顶点 match 值为 -1/传入图的顶点数 n 和邻接阵 mat#define MAXN 100int aug(int n,int matMAXN,int* match,int* v,int now)int i,ret=0;vnow=1;for (i=0;i=2;)if (matchi=0);return j/2;4。7 一般图匹配(正向表)/一般图最大匹配,正向表形式,复杂度 O(n*e)/返回匹配顶点对数,match 返回匹配,未匹配顶点 match 值为 -1/传入图的顶点数 n 和正向表 list,buf#define MAXN 100int aug(int n,int* list,int* buf,int* match,int* v,int now)int i,t,ret=0;vnow=1;for (i=listnow;i=2;)if (matchi=0);return j/2;