您的位置:首页 > 其它

CodeForces 216B Forming Teams(并查集判断奇数环)

2015-04-07 19:19 459 查看
题意:有一群人要踢足球,但是在这些人中有几对人存在敌对的关系,要求每个队的人数相等并且同一个队中不存在互为敌对关系的人,每个人最多只会讨厌两个人,如果a讨厌b,那么b也会讨厌a,问你至少有多少人不能参加比赛。

思路分析:判断奇数环,当加入一条边时,判断这条边连接的点是否在同一个集合中,如果不在同一个集合则加入,如果两个点在同一个集合中,则判断根节点的子节点数,如果是奇数,这这条边不能加入,说明有一个人不能参加(画画图就知道了),最后再判断总体的人数是否是偶数。

代码实现:

#include<stdio.h>
#include<string.h>
int fa[110],total[110],n,m;
int Find(int a){
return a==fa[a]?fa[a]:fa[a]=Find(fa[a]);
}
int main(){
while(~scanf("%d%d",&n,&m)){
int a,b;
for(int i=1;i<=n;i++){
fa[i]=i;
total[i]=1;
}
int sum=0;
while(m--){
scanf("%d%d",&a,&b);
int x=Find(a);
int y=Find(b);
if(x!=y){
fa[x]=y;
total[y]+=total[x];
total[x]=1;
}
else{
if(total[x]%2){
sum++;
//printf("**%d %d\n",total[x],sum);
}
}
}
if((n-sum)%2) sum++;
printf("%d\n",sum);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: