二分图最大匹配--匈牙利算法

关于算法的讲解,个人觉得这篇博文写得非常好:http://blog.csdn.net/dark_scope/article/details/8880547

我的代码:

 1 #include <cstdio>
 2 #include <vector>
 3 #include <cstring>
 4 
 5 using namespace std;
 6 
 7 #define MAXN 1005
 8 
 9 vector<int> g[MAXN];
10 int n, m, color[MAXN], mm[MAXN];
11 bool used[MAXN];
12 
13 bool isBiGraph(int x, int co)
14 {
15     bool ret = true;
16     color[x] = co;
17     int sz = g[x].size();
18     for(int i=0; i<sz; ++i)
19     {
20         int y = g[x][i];
21         if(color[y]<0)
22         {
23             ret = ret&&isBiGraph(y, co^1);
24             if(!ret) return ret;
25         }
26         else if(color[y]==co)   return false;
27     }
28     return ret;
29 }
30 
31 bool findm(int x)
32 {
33     int sz = g[x].size();
34     for(int i=0; i<sz; ++i)
35     {
36         int y = g[x][i];
37         if(!used[y])
38         {
39             used[y] = true;
40             if(mm[y]==0 || findm(mm[y]))
41             {
42                 mm[x] = y;
43                 mm[y] = x;
44                 return true;
45             }
46         }
47     }
48     return false;
49 }
50 
51 void init()
52 {
53     for(int i=1; i<=n; ++i) g[i].clear();
54     memset(color+1, -1, n*sizeof(int));
55     memset(mm+1, 0, n*sizeof(int));
56 }
57 
58 int main()
59 {
60     while(scanf("%d%d", &n, &m)!=EOF)
61     {
62         init();
63         while(m--)
64         {
65             int u, v;
66             scanf("%d%d", &u, &v);
67             g[u].push_back(v);
68             g[v].push_back(u);
69         }
70         if(isBiGraph(1, 0))
71         {
72             int ans = 0;
73             for(int i=1; i<=n; ++i)
74             {
75                 if(color[i])
76                 {
77                     memset(used+1, 0, n);
78                     if(findm(i)) ++ans;
79                 }
80             }
81             printf("%d\n", ans);
82         }
83         else puts("0");
84     }
85     return 0;
86 }

 

posted @ 2015-02-23 14:09  __brthls  阅读(188)  评论(0编辑  收藏  举报