P1892 团伙

题面: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);
}
posted @ 2019-07-16 15:04  prestige  阅读(106)  评论(0编辑  收藏  举报