P1892-團伙【圖論,並查集】
阿新 • • 發佈:2019-02-17
正題
大意
兩個人如果認識就只有兩種關係,敵人或朋友
而:
朋友的朋友是朋友
敵人的敵人是朋友
(敵人之間也可能是敵人)
求團伙總數
解題思路
就像做食物鏈一樣,如果y和x+n連線那麼說明y和x是敵人,朋友的話就直接連就好了。
程式碼
#include<cstdio>
using namespace std;
int n,m,x,y,father[2001],s;
char c;
int find(int x)
{
if (x!=father[x]) return father[x]=find(father[x]);
return father[x];
}
void unionn(int x,int y)
{
int fa=find(x),fb=find(y);
father[fa]=fb;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n*2;i++) father[i]=i;
for (int i=1;i<=m;i++)
{
scanf("\n%c %d %d",&c,&x,&y);
if (c=='F')
{
unionn(x,y);
}
else if (c=='E')
{
unionn(y+n,x);
unionn(x+n,y);
}
}
for (int i=1;i<=n;i++)
if (father[i]==i) s++;
printf("%d",s);
}