P1892 [BOI2003] 團伙
種類並查集!!!!
主要要理解敵人的敵人就是朋友這句話,我們就可以用並查集來維護朋友,用一個陣列來儲存他的其中一個敵人,後面遇到其他他的敵人時,將他的敵人用並查集連起來成為朋友。
注意這題要你輸出團隊數而不是團隊的人數不會就我這麼唐吧。
#include <bits/stdc++.h>
using namespace std;
const int N=1005;
int n,m;
int fa[N];
int a[N];
int find(int x){
return fa[x]==x?x:find(fa[x]);
}
void add(int u,int v){
int x=find(u);
int y=find(v);
fa[x]=y;
}
int cnt[1005];
int ans;
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++){
fa[i]=i;
}
for(int i=1;i<=m;i++){
char c;
int u,v;
cin>>c>>u>>v;
if(c=='F'){
add(u,v);
}
else{
if(!a[u]){
a[u]=v;
}
else{
add(a[u],v);
}
if(!a[v]){
a[v]=u;
}
else{
add(a[v],u);
}
}
}
for(int i=1;i<=n;i++){
cnt[find(i)]++;
}
for(int i=1;i<=n;i++){
if(cnt[i]){
ans++;
}
}
cout<<ans;
return 0;
}
當然這題的方法開兩倍空間進行維護。