标签:

2 3 3 T 1 2 T 3 2 Q 2 3 4 T 1 2 Q 1 T 1 3 Q 1
Case 1: 2 3 0 Case 2: 2 2 1 3 3 2
题意:n个龙珠,编号为1...n,分别在编号1....n的城市中。
有两种操作,T A B,把A所在的城市的龙珠全部放到B所在的城市里;Q A,查询龙珠A所在的城市,以及城市现在有几个球,以及A被转移了几次。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 10000 + 100
using namespace std;
int per[maxn];
int num[maxn];
int mov[maxn];
int N, M;
void init(){
for(int i = 1; i <= N; ++i){
per[i] = i;
num[i] = 1;
mov[i] = 0;
}
}
int Find(int x){
if(x == per[x]) return x;
else{
int t = per[x];
per[x] = Find(per[x]);
mov[x] += mov[t];
}
return per[x];
}
void jion (int a, int b){
int fa = Find(a);
int fb = Find(b);
if(fa != fb){
per[fa] = fb;
num[fb] += num[fa];
mov[fa]++;
}
}
int main (){
int T;
int k = 0;
scanf("%d", &T);
while(T--){
scanf("%d%d", &N, &M);
init();
printf("Case %d:\n", ++k);
while(M--){
char str[5];
int a, b;
scanf("%s", str);
if(str[0] == 'T'){
scanf("%d%d", &a, &b);
jion (a, b);
}
else {
scanf("%d", &a);
int d = Find(a);
printf("%d %d %d\n", d, num[d], mov[a]);
}
}
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 3635--Dragon Balls【并查集,有技巧】
标签:
原文地址:http://blog.csdn.net/hpuhjh/article/details/47177361