概述:龙珠分布在许多城市,而且,经过一段时间之后,一些城市的龙珠就会被运送到其他的城市,如果是输入T a b,那么进行移动, 把编号a的龙珠所在的城市的所有龙珠移动到编号b龙珠所在的城市。
输入Q a, 那么输出a龙珠所在的城市, a龙珠所在城市有的龙珠的个数, 以及a龙珠移动的次数。
思路:也是一个简单的并查集问题,继续套用 find 和 merge 函数。
感想:这个题和1023是一个思路。
#include<cstring>
#include<cstdio>
#include<fstream>
const int MAX = 10005;
using namespace std;
int dragon[MAX];
int city[MAX];
int cnt[MAX];
int n, q;
int findx(int x)
{
if (x == city[x])
return city[x];
int tem = city[x];
city[x] = findx(city[x]);
cnt[x] += cnt[tem];
return city[x];
}
void merge(int x, int y)
{
x = findx(x);
y = findx(y);
if (x != y) {
city[x] = city[y];
dragon[y] += dragon[x];
dragon[x] = 0;
cnt[x] = 1;
}
}
int main()
{
ifstream cin("aaa.txt");
int t, a, b, tt = 0;
char str[2];
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++)
{
city[i] = i;
dragon[i] = 1;
cnt[i] = 0;
}
printf("Case %d:\n", ++tt);
while (q--)
{
scanf("%s", str);
if (str[0] == 'T')
{
scanf("%d%d", &a, &b);
merge(a, b);
}
else
{
scanf("%d", &a);
b = findx(a);
printf("%d %d %d\n", b, dragon[b], cnt[a]);
}
}
}
return 0;
}