784. 强盗团伙 知识点:并查集

66 阅读1分钟

784. 强盗团伙 - AcWing题库 这道题的关键是敌人的敌人是朋友这句话。

因此对于当a和b是敌人的时候我们需要分两种情况来判断一下。、

1是a如果与b的敌人是敌人的话那么就把a合并到b的敌人的集合里面。

2是如果a与b的敌人是朋友的话,那么也把a合并到b的朋友的集合里面。

#include<bits/stdc++.h>
using namespace std;
const int N = 2500;
int p[N];
int n,m;
int find(int x){
    if(x!=p[x]) p[x]=find(p[x]);
    return p[x];
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=2*n;i++) p[i] = i;
    char op;
    int a,b;
    while(m--){
        cin>>op>>a>>b;
        if(op=='E'){  //a和b是敌人
            p[find(a+n)] = find(b);
            p[find(b+n)] = find(a);
        }else{ //a和b是朋友
            p[find(a)] = find(b);
        }
    }
    int ans = 0;
    for(int i=1;i<=n;i++) if(p[i] == i) ans++;
    cout<<ans<<endl;
    return 0;
}

image.png