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 }

 

posted @ 2012-08-15 17:16  Naix_x  阅读(232)  评论(0编辑  收藏  举报