Dragon Balls(并查集)

来源:互联网 发布:sql 没有权限 编辑:程序博客网 时间:2024/06/05 05:35

Dragon Balls
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 864 Accepted Submission(s): 343

Problem Description
Five hundred years later, the number of dragon balls will increase unexpectedly, so it\\\\’s too difficult for Monkey King(WuKong) to gather all of the dragon balls together.

His country has N cities and there are exactly N dragon balls in the world. At first, for the ith dragon ball, the sacred dragon will puts it in the ith city. Through long years, some cities\\\\’ dragon ball(s) would be transported to other cities. To save physical strength WuKong plans to take Flying Nimbus Cloud, a magical flying cloud to gather dragon balls.
Every time WuKong will collect the information of one dragon ball, he will ask you the information of that ball. You must tell him which city the ball is located and how many dragon balls are there in that city, you also need to tell him how many times the ball has been transported so far.

Input
The first line of the input is a single positive integer T(0 < T <= 100).
For each case, the first line contains two integers: N and Q (2 < N <= 10000 , 2 < Q <= 10000).
Each of the following Q lines contains either a fact or a question as the follow format:
T A B : All the dragon balls which are in the same city with A have been transported to the city the Bth ball in. You can assume that the two cities are different.
Q A : WuKong want to know X (the id of the city Ath ball is in), Y (the count of balls in Xth city) and Z (the tranporting times of the Ath ball). (1 <= A, B <= N)

Output

        For each test case, output the test case number formated as sample output. Then for each query, output a line with three integers X Y Z saparated by a blank space.

Sample Input

2
3 3
T 1 2
T 3 2
Q 2
3 4
T 1 2
Q 1
T 1 3
Q 1

Sample Output

Case 1:
2 3 0
Case 2:
2 2 1
3 3 2

//解题思路
之前交上一直超时 后来采用了并查集的压缩路径
关键代码:

int find (int x){    if(x!=ff[x])        ff[x]= find(ff[x]);    return ff[x];}

然后一边压缩 一边记录其移动次数

#include<stdio.h>#include<string.h>#define maxn 10010int tree[maxn];int citynum[maxn];//记录每个城市的龙珠个数int tranum[maxn];//记录每个龙珠移动的次数int find(int x)//while循环的路径压缩不知道怎么处理移动次数,无奈递归了{    int t;    if(x!=tree[x])    {        int t=tree[x];        tree[x]=find(tree[x]);        tranum[x]+=tranum[t];//加上父节点的移动次数的次数    }    return tree[x];}void megre(int x,int y){    int fx=find(x);    int fy=find(y);    if(fx!=fy)    {        tree[fx]=fy;        citynum[fy]+=citynum[fx];//把子节点的龙珠全部给父节点        tranum[fx]++;//转移次数加一    }}int main(){    int T,k=1,n,q,i,a,b;    char s[3];    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&q);        for(i=1;i<=n;++i)        {            tree[i]=i;            citynum[i]=1;            tranum[i]=0;        }        printf("Case %d:\n",k++);        while(q--)        {            scanf("%s",s);            if(s[0]=='T')            {                scanf("%d%d",&a,&b);                megre(a,b);            }            else            {                scanf("%d",&a);                int t=find(a);                printf("%d %d %d\n",t,citynum[t],tranum[a]);            }        }    }    return 0;}
原创粉丝点击