HDU 3635 Dragon Balls 并查集水题 模拟

题意:n个龙珠,编号为1...n,分别在编号1....n的城市中。有两种操作,T A B,把A所在的城市的龙珠全部放到B所在的城市里;Q A,查询龙珠A所在的城市,以及城市现在有几个球,以及A被转移了几次。

很明显的并查集题目,刚开始没注意看是AB所在的城市,WA了一次...

代码:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  Blog:        http://blog.csdn.net/hcbbt
*  File:        hdu3635.cpp
*  Create Date: 2013-12-06 14:24:29
*  Descripton:  union set 
*/

#include <cstdio>
#include <cstring>

const int MAXN = 1e4 + 10;

int cnt[MAXN], pos[MAXN];
int n, q, t, a, b;
char op[3];

int main() {
	int cas = 1;
	scanf("%d", &t);
	while (t--) {
		scanf("%d%d", &n, &q);
		printf("Case %d:\n", cas++);
		// init
		for (int i = 0; i <= n; i++)
			cnt[i] = 1, pos[i] = i;

		// quest
		while (q--) {
			scanf("%s", op);
			if (op[0] == 'T') {
				scanf("%d%d", &a, &b);
				// a -> b;
				while (a != pos[a])
					a = pos[a];
				while (b != pos[b])
					b = pos[b];
				cnt[b] += cnt[a];
				cnt[a] = 0;
				pos[a] = b;
			}
			else {
				scanf("%d", &a);
				b = 0;
				while (a != pos[a])
					a = pos[a], b++;
				printf("%d %d %d\n", a, cnt[a], b);
			}
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值