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