题目描述
在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足:
1、 一个人的朋友的朋友是他的朋友。
2、 一个人敌人的敌人是他的朋友。
3、 一个人和他所有的朋友在同一个团伙。
4、 一个人的所有敌人是同一个团伙。
告诉你关于这n个人的m条信息(即某两人是朋友,或者某两个人是敌人),请你计算出这个城市的人最多有多少个团伙。
思路
用x+n表示敌人的敌人,每次用这个数的不是敌人的数和敌人的敌人合并就成了朋友,最后判断一下有几个集合就可
#include
#include
#include
#include
#define max 100000
using namespace std;
int f[max+1],a[max+1],o[max+1][3],fl[max+1];
int find(int x)
{
if (f[x]==x) return x;
f[x]=find(f[x]);
return f[x];
}
int insert(int x,int y)
{
if (find(x)!=find(y))
{
f[find(x)]=find(y);
return 1;
}
return 0;
}
int cam(int x,int y)
{
return x>ch>>x>>y;
if (ch=='0')
{
insert(x,y);
}
else
{
insert(x,y+n);
insert(y,x+n);
}
}
int ans=0;
for (int i=1;i<=n;i++)
a[i]=find(f[i]);
sort(a+1,a+n+1,cam);
for (int i=1;i<=n;i++)
if (a[i]!=a[i-1]) ans++;
printf("%d\n",ans);
}
Comments NOTHING