uva 10608 - Friends (并查集)
来源:互联网 发布:2017php就业前景 编辑:程序博客网 时间:2024/04/29 22:38
/* 简单的并查集题目,其实就是求图的最大连通块的顶点的个数, 要注意的一点是。root[i] != FindSet(i); 由于并查集单向合并的原因,因此root[i]不一定是i的根节点,FindSet(i)才是!*/#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N = 30010;int root[N];int ans[N];void InitSet(int n){ for(int i = 1 ; i <= n ; i++) { root[i] = i; ans[i] = 0; }}int FindSet(int n){ if(n != root[n]) { root[n] = FindSet(root[n]); } return root[n];}void UnionSet(int n,int m){ int x = FindSet(n); int y = FindSet(m); if(x != y) { root[y] = x; }}int main(){ int ncase; scanf("%d",&ncase); while(ncase--) { int n,m; scanf("%d %d",&n,&m); InitSet(n); for(int i = 0 ; i < m ; i++) { int a,b; scanf("%d %d",&a,&b); UnionSet(a,b); } for(int i = 1; i <= n ; i++) { int x = FindSet(i); ans[x]++; } int maxx = -1; for(int i = 1 ; i <= n ; i++) { if(maxx < ans[i]) { maxx = ans[i]; } } cout<<maxx<<endl; } return 0;}