现在的位置: 首页 > 综合 > 正文

Dragon Balls

2013年10月28日 ⁄ 综合 ⁄ 共 958字 ⁄ 字号 评论关闭

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=34236#problem/D

无力吐槽,少了memset这个头文件,居然判断的是TLE。。。

题意:给你N个标记了的点,从1~N代表第几颗龙珠,但是龙珠会移动到不同的城市,执行的命令中T代表移动,现在要求的就是Q查询第i颗龙珠目前所在的城市的编号,并且输出该城市目前总的龙珠个数,还有第i颗龙珠移动到该城市的次数;

解析:裸并查集,使用数组Move存储移动的次数,sum统计目前的龙珠数目;

// d.cpp : 定义控制台应用程序的入口点。
//

//#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <cstring>>
using namespace std;

const int maxn = 10005;
int fa[ maxn ], Move[ maxn ], sum[ maxn ];

void Start(){
	memset( Move, 0, sizeof( Move ) );
	for( int i = 0; i < maxn; ++i ){
		fa[ i ] = i;
		sum[ i ] = 1;
	}
}

int find( int x ){
	if( x == fa[ x ] )
		return x;
	int temp = find( fa[ x ] );
	Move[ x ] += Move[ fa[ x ] ];
	return fa[ x ] = temp;
}

void Union( int a, int b ){
	int x = find( a );
	int y = find( b );
	//if( x != y )
	{
		sum[ y ] += sum[ x ];
		Move[ x ]++;
		fa[ x ] = y;
	}
}

//int _tmain(int argc, _TCHAR* argv[])
int main()
{
	int Case, n, m, a, b;
	char ch;
	cin >> Case;
	for( int i = 1; i <= Case; ++i ){
		printf( "Case %d:\n", i );
		Start();
		cin >> n >> m;
		while( m-- ){
			cin >> ch;
			if( ch == 'T' ){
				cin >> a >> b;
				Union( a,  b );
			}
			else{
				cin >> a;
				int temp = find( a );
				printf( "%d %d %d\n", temp, sum[ temp ], Move[ a ] );
			}
		}
	}
	return 0;
}

抱歉!评论已关闭.