KM 算法,详细资料见上一篇,此处只贴模板 #include <iostream> #include <string.h> #include <algorithm> #include <iostream> using namespace std; int max(int a,int b) {return a<b?b:a;} int min(int a,int b) {return a<b?a:b;} const int size = 160; const int INF = 100000000; bool map[size][size]; // 二分图的相等子图, map[i][j] = true 代表Xi与Yj有边 bool sx[size], sy[size]; // 标记在一次DFS中,Xi与Yi是否在交错树上 int match[size]; // 保存匹配信息,其中i为Y中的顶点标号,match[i]为X中顶点标号 bool DFS(int, const int); void KM_Perfect_Match(const int n, const int edge[][size]) { int i, j; int lx[size], ly[size]; // KM算法中Xi与Yi的标号 for(i = 0; i < n; i++) { lx[i] = -INF; ly[i] = 0; for(j = 0; j < n; j++) { lx[i] = max(lx[i], edge[i][j]); } } bool perfect = false; while(!perfect) { // 初始化邻接矩阵 for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { if(lx[i]+ly[j] == edge[i][j]) map[i][j] = true; else map[i][j] = false; } } // 匹配过程 int live = 0; memset(match, -1, sizeof(match)); for(i = 0; i < n; i++) { memset(