犯罪团伙(并查集)学习总结

//警察抓到了n个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,
//但通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识。
//有可能一个犯罪团伙只有一个人。请你根据已知罪犯之间的关系,确定犯罪团伙的数量。已知罪犯的编号从1至n。
//输入:
//第一行:n(<=10000,罪犯数量),
//第二行:m(<=100000,关系数量)
//以下m行:每行两个数:I 和j,中间一个空格隔开,表示罪犯i和罪犯j相互认识。
//输出:一个整数,犯罪团伙的数量。
#include <iostream>
using namespace std;
const int maxn = 100001;
int father[maxn] = {0};
int find(int i) {
    if (father[i] == 0) return i;
    if (father[father[i]] == 0) return father[i];
    int pos = find (father[i]);
    father[i] = pos; //路径压缩
    return pos;//返回父亲的值
}
int main() {
    int n,m,q,p,x,y;
    cin >> n >> m;
    for (int i = 0;i < m; i++) {
        cin >> x >> y;
        p = find (x);
        q = find (y);
        if (p != q) father[p] = q;
    }
    int ans = 0;
    for (int i = 0;i < n; i++) {
        if (father[i] == 0) ans++;
    }
    cout << ans << endl;
}

 

posted @ 2014-02-13 16:31  闪光阳  阅读(936)  评论(0编辑  收藏  举报