Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4091 Accepted Submission(s): 1876
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 6 using namespace std; 7 const int MAX = 210; 8 int father[MAX],a[MAX]; 9 int g[MAX][MAX],vis[MAX],link[MAX]; 10 int n,m; 11 int find_father(int x) 12 { 13 if(x == father[x]) 14 return x; 15 int t = find_father(father[x]); 16 a[x] = (a[father[x]] + a[x]) % 2; 17 return father[x] = t; 18 } 19 int dfs(int x) 20 { 21 for(int i = 1; i <= n; i++) 22 { 23 if(vis[i] == 0 && g[x][i]) 24 { 25 vis[i] = 1; 26 if(link[i] == 0 || dfs(link[i])) 27 { 28 link[i] = x; 29 return true; 30 } 31 } 32 } 33 return false; 34 } 35 int main() 36 { 37 while(scanf("%d%d",&n,&m) != EOF) 38 { 39 for(int i = 0; i <= n; i++) 40 { 41 father[i] = i; 42 a[i] = 0; 43 } 44 memset(g,0,sizeof(g)); 45 memset(link,0,sizeof(link)); 46 int flag = 0,ans = 0; 47 while(m--) 48 { 49 int x,y,fx,fy; 50 scanf("%d%d",&x,&y); 51 g[x][y] = g[y][x] = 1; 52 fx = find_father(x); 53 fy = find_father(y); 54 if(fx != fy) 55 { 56 father[fy] = fx; 57 if(a[x] == 0) 58 { 59 a[fy] = 1 - a[y]; 60 } 61 else 62 a[fy] = a[y]; 63 } 64 else 65 { 66 if(a[x] == a[y]) 67 { 68 flag = 1; 69 } 70 } 71 } 72 if(flag) 73 { 74 printf("No\n"); 75 } 76 else 77 { 78 for(int i = 1; i <= n; i++) 79 { 80 memset(vis,0,sizeof(vis)); 81 if(dfs(i)) 82 ans++; 83 } 84 printf("%d\n",ans/2); 85 } 86 } 87 88 return 0; 89 }
HD2444The Accomodation of Students(并查集判断二分图+匹配)
原文:http://www.cnblogs.com/zhaopAC/p/5011690.html