1. 程式人生 > >Codevs2597 團伙 並查集

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; }