hihoCoder#1122 二分图二•二分图最大匹配之匈牙利算法

原题地址

 

只能说匈牙利算法不能更屌,而且提示里给的伪码也不能更屌了!

只用了第二个优化,因为将输入点集分割成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 }

 

你可能感兴趣的:(code)