hdu3974-并查集办法

来源:互联网 发布:meego社交软件 编辑:程序博客网 时间:2024/06/10 16:56
#include <iostream>
#include <stdio.h>
using namespace std;
int father[50010];
int relation[50010];
int time[50010];
void init(int n)
{
    for(int i=1;i<=n;i++)
    {
        relation[i]=-1;
        father[i]=i;
        time[i]=-1;
    }
}
int find(int x)
{
    if(x!=father[x])
    {
        int tmp=father[x];
        find(father[x]);
        if(time[tmp]>time[x])
        {
            time[x]=time[tmp];
            relation[x]=relation[tmp];
        }
    }
    return father[x];


}
void Union(int x,int y)
{


        father[x]=y;


}
int main()
{
    int T;
    cin>>T;
    for(int k=1;k<=T;k++)
    {   int n,x,y;
        cin>>n;
        init(n);
        for(int j=1;j<n;j++)
        {
            cin>>x>>y;
            Union(x,y);
        }
        int m;
        char ch[5];
        cin>>m;
        int cot=0;
        printf("Case #%d:\n",k);
        while(m--)
        {   scanf("%s",ch);
            if(ch[0]=='T')
            {
                cin>>x>>y;
                time[x]=cot++;
                relation[x]=y;
            }
            else
            {  
                cin>>x;
                find(x);
                cout<<relation[x]<<endl;
            }
        }
    }
    return 0;
}
0 0