题目链接http://codeforces.com/problemset/problem/216/B
题意:有一群人要踢足球,但是在这些人中有几对人存在敌对的关系,要求每个队的人数相等并且同一个队中不存在互为敌对关系的人,每个人最多只会讨厌两个人,如果a讨厌b,那么b也会讨厌a,问你至少有多少人不能参加比赛。
并查集的应用:
我们先把存在敌对关系的人之间连一条边,通过并查集把他们放在一个集合里,每次加入一条边时先判断这一条边的两点是否已存在同一个集合里,如果是,那么就构成了环,注意题目所说的每个人最多只会讨厌两个人,自己画画图就知道了,对环进行0,1,染色,可知如果环里面的人数为奇数,那么就需要提一个人出来,才能满足一个队中没有互相讨厌的人,否则就会有冲突。用总人数-奇数环的个数,如果该数为偶数,直接输出奇数环的个数,如果为奇数,则要在奇数环的个数上在剔除一个人。
#define size 110
int father[110],vis[110],num[110];
int n,m,a,b;
int find(int p)
{
return p==father[p] ? p : find(father[p]);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
{
vis[i]=0;
num[i]=1;
father[i]=i;
}
int ans = 0;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
int la = find(a);
int lb = find(b);
if(la==lb) vis[la] = 1,vis[lb] = 1;
if(la!=lb) father[la]=lb,num[lb] += num[la];
}
for(int i = 1;i<=n;i++)
if(father[i]==i&&vis[i]==1)
ans += num[i]%2;
printf("%d\n",n-(n - ans)/2*2);
}
return 0;
}
Problem - 216B - Codeforces
最新推荐文章于 2019-09-11 16:30:41 发布