acwing 784. 強盜團伙

傳送門

經典並查集問題

#include<bits/stdc++.h>

using namespace std;
const int N = 1010;

int n, m;
vector<int> e[N]; ///記錄敵人
int f[N];

int Find(int x)
{
    return f[x] = (x==f[x])?x:Find(f[x]);
}
void merge(int x, int y)
{
    x = Find(x), y = Find(y);
    if(x == y) return ;
    if(x < y) f[y] = x;
    else f[x] = y;
}
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1;i <= n; ++i) f[i] = i;
    while(m--)
    {
        char op;
        int x, y;
        scanf(" %c%d%d", &op, &x, &y);
        if(op == 'F'){
            merge(x, y);
        }else {
            e[x].push_back(y);
            e[y].push_back(x);
        }
    }
    for(int i = 1; i <= n; ++i) { ///敵人的敵人就是朋友
        for(int x:e[i])
        for(int y:e[i])
        merge(x, y);
    }
    int c= 0;
    for(int i = 1;i <= n; ++i)
    if(Find(i) == i) c++;
    printf("%d\n", c);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章