洛谷 P1892 [BOI2003] 團伙

sad_lin發表於2024-09-11

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; 
}

當然這題的方法開兩倍空間進行維護。