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 }

 

你可能感兴趣的:(codeforces)