Codevs2597 團伙 並查集

Codevs2597 團伙
還是做題太少啊,然而NOIP了。
代碼簡單易懂:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
using namespace std;

#define MAXN (1010)
int ans;
int fa[MAXN], en[MAXN];

int find(int x)
{
    int t, r = x;
    while(r != fa[r]) r = fa[r];
    while(x != r) {t=fa[x];fa[x]=r;x=t;}
    return r;
}

void lianjie(int x, int y)
{
    int fx = find(x);
    int fy = find(y);
    if(fx != fy)
    {   
        fa[fx] = fy;
        -- ans; //每連接一個就少一個團伙 
    }
}

char t[5];
int main()
{
    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= n; ++ i)
        fa[i] = i;
    ans = n; // 剛開始共有n個團伙 
    for(int i = 1; i <= m; ++ i)
    {
        scanf("%s", t);
        int p, q;
        scanf("%d%d", &p, &q);
        if(t[0] == 'F')
            lianjie(p,q);
        else {
            if(en[p]) lianjie(en[p], q); // 如果 p 有敵人,那麼q和他就是朋友 
            en[p] = q;
            if(en[q]) lianjie(en[q], p);
            en[q] = p;
        }
    }
    cout << ans << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章