杭电 HOJ 3635 Dragon Balls 解题报告

    第一次接触并查集。其实也不复杂,看代码应该很容易懂的:

#include <iostream>

using namespace std;



int s[10001],mov[10001],num[10001];



int find(int a)

{

    if(s[a])

    {

        int temp=s[a];

        s[a]=find(s[a]);

        mov[a]+=mov[temp];

        return s[a];

    }

    return a;

}



void bing(int a,int b)

{

    a=find(a);

    b=find(b);

    num[b]+=num[a];

    s[a]=b;

    mov[a]=1;

}



int main()

{

    char ch[2];

    int n,m,i,j,cas,c=1;

    scanf("%d",&cas);

    while(cas--)

    {

        printf("Case %d:\n",c++);

        scanf("%d%d",&n,&m);

        memset(s,0,sizeof(s));

        memset(mov,0,sizeof(mov));

        for(i=1;i<=n;i++)

            num[i]=1;

        while(m--)

        {

            scanf("%s%d",ch,&i);

            if(ch[0]=='T')

            {

                scanf("%d",&j);

                bing(i,j);

            }

            else

            {

                j=find(i);

                printf("%d %d %d\n",j,num[j],mov[i]);

            }

        }

    }

}

 

你可能感兴趣的:(drag)