思路:题目大意就是,要组织足球赛,首先其中的队员都会有仇人,所以他们不能够在同一组,每个人的仇人的个数不超过两个,如果A与B是仇人,那么B与A也是仇人,给定仇人的序列,让你判断需要剔除的最少人数以使足球赛能够进行。
并查集的题目,用root数组将能够成为一组的人并在一起,使用sex数组记录每个人的敌人,具体见代码(思路可参照本博客中并查集的A bug‘s life!)。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int root[110],sex[110];
int n,m;
void chu()
{
for(int i=0;i<=n;i++)
root[i]=i;
memset(sex,0,sizeof(sex));
}
int look(int a)
{
if(a!=root[a])
a=look(root[a]);
return a;
}
void _union(int a,int b)
{
a=look(a);
b=look(b);
if(a!=b) root[a]=b;
}
int main()
{
while(scanf("%d%d",&n,&m)!=-1)
{
int x,y;
int i,ans=0;
chu();
for(i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
x=look(x);
y=look(y);
if(x==y) ans++;
else if(!sex[x]&&!sex[y]) {sex[x]=y;sex[y]=x;}
else if(!sex[x]) {sex[x]=y;_union(x,sex[y]);}
else if(!sex[y]) {sex[y]=x;_union(sex[x],y);}
else {_union(sex[x],y);_union(x,sex[y]);}
}
if((n-ans)%2==1) ans++;
printf("%d\n",ans);
}
return 0;
}