犯罪团伙(并查集)学习总结
//警察抓到了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; }