ADT:
1 const int maxn = 150; //表示集合x,y中顶点个数的最大值 2 3 int n,m; // n,m分别表示 x,y中顶点个数 4 bool g[maxn][maxn]; //邻接矩阵,1表示有连接 5 int cx[maxn];//最大匹配中,与x集合中x[i]匹配的y集合中顶点的索引 6 int cy[maxn]; 7 8 int mk[maxn];//dfs算法中记录顶点访问状态的数据, 0未访问 9 10 bool dfs(int u){ //用来寻找增广路 11 for(int i=0;i<m;i++){ //考虑y中所有顶点 12 if(g[u][i]&&!mk[i]){ 13 mk[i] = 1; //访问 14 if(cy[i]==-1||dfs(cy[i])){ //未匹配则将i匹配给u,不然从cy[i]也就是说i之前已经匹配的x出发,找增广路,注意这里i已经记录访问过了 15 cx[u] = i; //把i匹配给u 16 cy[i] = u; //相互匹配 17 return 1; 18 } 19 } 20 } 21 return 0; //如果不存在u出发的增广路,返回0 22 } 23 24 int Hungarian(){ 25 int res = 0; 26 memset(cx,-1,sizeof(cx)); 27 memset(cy,-1,sizeof(cy)); 28 for(int i=0;i<n;i++){ 29 if(cx[i]==-1){ //从x中每个没有匹配的店出发寻找增广路 30 memset(mk,0,sizeof(mk)); 31 res += dfs(i); //return 为0或1,所以有dfs,就加一 32 } 33 } 34 return res; 35 }
参考链接:blog.csdn.net/flynn_curry/article/details/52966283 二分图应用
http://blog.csdn.net/thundermrbird/article/details/52231639 二分图理解