题面:https://www.luogu.org/problemnew/show/P1892
本题可以把朋友并在一起,用一个数组记录敌人,然后把敌人的敌人和自己并在一起即可。
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<ctime>
using namespace std;
int n,m,i,ans,a,b,f[500005],s[500005];
char c;
int find(int x){
if(f[x]==0){
return x;
}
else{
return f[x]=find(f[x]);
}
}
void unionn(int a,int b){
int l=find(a);
int r=find(b);
if(l!=r){
f[l]=r;
}
}
int main(){
cin>>n>>m;
for(i=1;i<=m;i++){
cin>>c>>a>>b;
if(c==‘F‘){
unionn(a,b);
}
if(c==‘E‘){
if(s[a]!=0){
unionn(s[a],b);
}
if(s[b]!=0){
unionn(s[b],a);
}
s[a]=b;
s[b]=a;
}
}
for(i=1;i<=n;i++){
if(f[i]==0){
ans++;
}
}
cout<<ans<<endl;
exit(0);
}