题意:给你1~n个城市每个城市有一个球编号与城市编号相同,现在又两种操作1.T X Y 把x气球所在城市的所有气球转移到y气球所在的城市。2.Q X 求出X气球所在的城市编号 城市中气球的总数 X气球移动的次数
思路:这题明显的并查集,其关键在于如何记录气球移动次数。每个城市配有一个气球,它移动的次数就是这个城市所有子气球到达这个城市之后移动的次数。也就是说这个气球移动的次数就是它父节点移动的次数之和
思路:这题明显的并查集,其关键在于如何记录气球移动次数。每个城市配有一个气球,它移动的次数就是这个城市所有子气球到达这个城市之后移动的次数。也就是说这个气球移动的次数就是它父节点移动的次数之和
饭后一水
#include<stdio.h>
#include<string.h>
#define maxN 10010
int cnt,fa[maxN],num[maxN],cn[maxN];
int find(int x)
{
if(x==fa[x])return x;
int m=find(fa[x]);
cn[x]+=cn[fa[x]];
return fa[x]=m;
}
int main()
{
int t,n,m,x,y;
scanf("%d",&t);
for(int h=1;h<=t;h++)
{
char str[10];
scanf("%d%d",&n,&m);
printf("Case %d:\n",h);
for(int i=0;i<=n;i++)
fa[i]=i,num[i]=1,cn[i]=0;
while(m--)
{
scanf("%s",str);
cnt=0;
if(str[0]=='T'){
scanf("%d%d",&x,&y);
int px=find(x),py=find(y);
num[py]+=num[px];
cn[px]++;
fa[px]=py;
}else{
scanf("%d",&x);
int px=find(x);
printf("%d %d %d\n",px,num[px],cn[x]);
}
}
}
}
本文探讨了利用并查集解决城市气球转移问题的算法,详细解释了如何通过并查集记录气球移动次数,并提供了完整的C语言实现代码。
11万+

被折叠的 条评论
为什么被折叠?



