【bzoj1370】[Baltic2003]Gang團伙 並查集
阿新 • • 發佈:2019-01-30
這可能是我最後幾天在機房寫題了,希望各位隊爺NOI能那個好成績吧。
每個點拆成兩個點,每一條邊,如果是朋友則直接連邊,如果是仇人,則從x向y+n連一條有向邊,從y向x+n連一條有向邊,這樣所有視y為敵人的人就屬於同一個集合了。
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #define maxn 2010 int f[maxn]; bool vis[maxn]; int n,T,num,m; int find(int i) { return f[i]==i?f[i]:f[i]=find(f[i]); } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=2*n;i++) f[i]=i; while (m--) { char s[5]; int x,y; scanf("%s%d%d",s,&x,&y); if (s[0]=='F') { int f1=find(x),f2=find(y); if (f1!=f2) f[f1]=f2; } else { int f1=find(x+n),f2=find(y); if (f1!=f2) f[f2]=f1; f1=find(x),f2=find(y+n); if (f1!=f2) f[f1]=f2; } } for (int i=1;i<=n;i++) { int x=find(i); if (!vis[x]) vis[x]=1,num++; } printf("%d\n",num); return 0; }