标签:
关于算法的讲解,个人觉得这篇博文写得非常好: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 }
标签:
原文地址:http://www.cnblogs.com/pczhou/p/4298030.html