标签:
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