只能说匈牙利算法不能更屌,而且提示里给的伪码也不能更屌了!
只用了第二个优化,因为将输入点集分割成A、B似乎挺麻烦的,索性就没用这个优化。
代码:
1 #include <iostream> 2 #include <cstring> 3 4 using namespace std; 5 6 #define MAX_VERTEX 1024 7 8 int N, M; 9 10 bool g[MAX_VERTEX][MAX_VERTEX]; 11 int m[MAX_VERTEX]; // match[vi] = ui 表示vi节点匹配的节点是ui 12 bool c[MAX_VERTEX]; // cover[vi] = true or false 表示vi节点是否已经被查询过了 13 14 bool findPath(int u) { 15 for (int i = 1; i <= N; i++) { 16 if (!g[u][i] || c[i]) 17 continue; 18 c[i] = true; 19 if (!m[i] || findPath(m[i])) { 20 m[u] = i; 21 m[i] = u; 22 return true; 23 } 24 } 25 return false; 26 } 27 28 int solve() { 29 int res = 0; 30 31 for (int i = 1; i <= N; i++) { 32 memset(c, 0, sizeof(c)); 33 if (!m[i] && findPath(i)) 34 res++; 35 } 36 37 return res; 38 } 39 40 int main() { 41 memset(g, 0, sizeof(g)); 42 memset(m, 0, sizeof(m)); 43 scanf("%d%d", &N, &M); 44 for (int i = 0; i < M; i++) { 45 int u, v; 46 scanf("%d%d", &u, &v); 47 g[u][v] = g[v][u] = true; 48 } 49 printf("%d\n", solve()); 50 return 0; 51 }