1. 程式人生 > >P1892-團伙【圖論,並查集】

P1892-團伙【圖論,並查集】

正題

大意

兩個人如果認識就只有兩種關係,敵人或朋友
而:
朋友的朋友是朋友
敵人的敵人是朋友
(敵人之間也可能是敵人)

求團伙總數

解題思路

就像做食物鏈一樣,如果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); }