Codeforces Round #133 (Div. 2) B Forming Teams
题目大意:n个人要分成两个队,m种敌对关系,选出两个相同人数去比赛,一个人至多有两个敌人,敌对的不能在一个队伍,求最少有个人不能上场。
我竟然没发现一个人至多有两个敌人这句话。。。然后就悲剧啊!!!用并查集去判断,是否存在奇数环。。研究了好一会别人代码。。才发现了那个条件,我本来以为并查集有很神的用法或者有证明神马的呢。。这就算个规律题吧。
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #define N 10000000 6 int p[101][101],o[101],rank[101]; 7 int find(int x) 8 { 9 while(x != o[x]) 10 x = o[x]; 11 return x; 12 } 13 void merge(int x,int y)//rank就是记录个数的。。。 14 { 15 o[x] = y; 16 rank[y] += rank[x]; 17 } 18 int main() 19 { 20 int x,y,i,n,m,sum; 21 scanf("%d%d",&n,&m); 22 sum = n; 23 for(i = 1;i <= n;i ++) 24 { 25 o[i] = i; 26 rank[i] = 1; 27 } 28 for(i = 1;i <= m;i ++) 29 { 30 scanf("%d%d",&x,&y); 31 x = find(x); 32 y = find(y); 33 if(x != y) 34 merge(x,y); 35 else if(rank[x]&1) 36 n--; 37 } 38 n = (n>>1) <<1;//最后取一个偶数 39 printf("%d\n",sum - n); 40 return 0; 41 }