HDU 3635 Dragon Balls
因为这道题卡了我几个小时,后来发现变量命名错误
因此记录一下这里一些注意的点
这里的思路是如果要移动的两个城市没有合并时(也就是px!=py),就将x的根节
点更新成y的根节点(x移到y),变换次数也加一,将当前的数量更新成x城的龙
珠数量加y城的龙珠数量(即将以y为根节点的龙珠数量加上以x为根结点的龙珠数量)
#include<iostream>
#include<cstdio>
using namespace std;
const int N=10010;
int a[N],b[N],c[N];//a为根结点,b为城市中龙珠总数量,c是交换次数
int find(int x)
{
if(x!=a[x])
{
int t=find(a[x]);
c[x]+=c[a[x]];//更新c[x],当px!=py时,会在x城市时变化加一
a[x]=t;
}
return a[x];
}
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
int n,q;
scanf("%d%d",&n,&q);
printf("Case %d:\n",i);
for(int i=1;i<=n;i++)
{
a[i]=i;
b[i]=1;
c[i]=0;
}
while(q--)
{
char ch[2];
//这样可以避免空格的影响
scanf("%s",ch);
if(ch[0]=='T')
{
int x,y;
scanf("%d%d",&x,&y);
int px=find(x),py=find(y);
//根节点
if(px!=py)
{
a[px]=py;//合并
b[py]+=b[px];
//总数量是两个祖宗树中总数,注意是x到y
c[px]++;//这里x到y,因此是c[px]+1
}
}
else
{
int x;
scanf("%d",&x);
int px=find(x);
printf("%d %d %d\n",px,b[px],c[x]);
}
}
}
return 0;
}