hdoj 3635 Dragon Balls【并查集求节点转移次数+节点数+某点根节点】

Dragon Balls

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4384    Accepted Submission(s):
1673

Problem Description

Five hundred years later, the number of dragon balls
will increase unexpectedly, so it‘s too difficult for Monkey King(WuKong) to
gather all of the dragon balls together.

His country
has N cities and there are exactly N dragon balls in the world. At first, for
the ith dragon ball, the sacred dragon will puts it in the ith city. Through
long years, some cities‘ dragon ball(s) would be transported to other cities. To
save physical strength WuKong plans to take Flying Nimbus Cloud, a magical
flying cloud to gather dragon balls.
Every time WuKong will collect the
information of one dragon ball, he will ask you the information of that ball.
You must tell him which city the ball is located and how many dragon balls are
there in that city, you also need to tell him how many times the ball has been
transported so far.

Input

The first line of the input is a single positive
integer T(0 < T <= 100).
For each case, the first line contains two
integers: N and Q (2 < N <= 10000 , 2 < Q <= 10000).
Each of the
following Q lines contains either a fact or a question as the follow
format:
  T A B : All the dragon balls which are in the same city with A have
been transported to the city the Bth ball in. You can assume that the two cities
are different.
  Q A : WuKong want to know X (the id of the city Ath ball is
in), Y (the count of balls in Xth city) and Z (the tranporting times of the Ath
ball). (1 <= A, B <= N)

Output

For each test case, output the test case number
formated as sample output. Then for each query, output a line with three
integers X Y Z saparated by a blank space.

Sample Input

2

3 3

T 1 2

T 3 2

Q 2

3 4

T 1 2

Q 1

T 1 3

Q 1

Sample Output

Case 1:

2 3 0

Case 2:

2 2 1

3 3 2

题意:遇到T时输入两个数x,y代表把x城市的龙珠转移到y城市,遇到Q输入a  求第a个龙珠所在的城市b,求b城市的龙珠总数,求

第a个龙珠的转移次数

题解:最难在于求龙珠的转移次数,当龙珠的父节点转移时,龙珠也跟着转移

#include<stdio.h>
#include<string.h>
#define MAX 20000
int set[MAX];
int path[MAX];
int time[MAX];
int find(int fa)
{
	int t;
    if(fa==set[fa])
    return fa;
     t=set[fa];
    set[fa]=find(set[fa]);
    time[fa]+=time[t];
    return set[fa];
}
void mix(int x,int y)
{
	int fx;
	int fy;
	fx=find(x);
	fy=find(y);
	if(fx!=fy)
	{
	    set[fx]=fy;
	    path[fy]+=path[fx];
	    time[fx]++;
	}
}
int main()
{
	int t,n,m,x,y,b,i;
	char a;
	scanf("%d",&t);
	int k=0;
	while(t--)
	{
		scanf("%d%d",&n,&m);
		printf("Case %d:\n",++k);
		for(i=1;i<=n;i++)
		{
			set[i]=i;
			path[i]=1;
			time[i]=0;
		}
		while(m--)
		{
			getchar();
			scanf("%c %d",&a,&x);
			if(a==‘T‘)
			{
				scanf("%d",&y);
				mix(x,y);
			}
			else
			{
				y=find(x);//此处必须用一个变量值来表示find(x)
				printf("%d %d %d\n",y,path[y],time[x]);
			}
		}
	}
	return 0;
}

  

时间: 2024-10-30 21:43:45

hdoj 3635 Dragon Balls【并查集求节点转移次数+节点数+某点根节点】的相关文章

HDU 3635 Dragon Balls(并查集)

Dragon Balls Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 64   Accepted Submission(s) : 26 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Five hundred years later

hdu 3635 Dragon Balls(并查集技巧)

题意:n个点m次询问,两种操作:1.将含有龙珠i的集合加入含有龙珠j的集合中:2.查询龙珠i所在堆的编号,龙珠个数,龙珠i的搬运次数: 思路:并查集,数组分别维护关系.数量.搬运次数: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; int fa[500010],time[500010],num[500010]; void init() { for(

测试赛F - Dragon Balls(并查集)

F - Dragon Balls Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Five hundred years later, the number of dragon balls will increase unexpectedly, so it's too difficult for Monkey King(WuKong) to

hdoj 3635 Dragon Balls

Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4517    Accepted Submission(s): 1719 Problem Description Five hundred years later, the number of dragon balls will increase unexpect

HDU 3635 Dragon Balls 七龙珠 Union Find算法

孙悟空要寻找七龙珠,这回是七龙珠的增强版了,因为这些龙珠会衍生,最后不止七颗龙珠了. 悟空带着布玛的龙珠雷达探测器出发了,却发现布玛的龙珠雷达探测器的程序太垃圾了,所以找到我们这些ACM高手为龙珠雷达探测器写个程序,要求可以显示某颗龙珠所在的城市的位置,该龙珠所在的城市共有多少颗龙珠,龙珠移动过的次数. 布玛是个有钱人啊,写个程序我要价5百万,不算过分吧.因为本程序需要用到Union Find(并查集)算法,而且最困难的部分是如何压缩路径,不压缩路径自然容易做到,要压缩路径可以使得程序加快很多,

关于一般的并查集求根操作的一组对照研究

说道并查集,大家一定对于以多叉树状结构为基础的并查集并不陌生最常见的两种写法如下 1 private function getfat(x:longint):longint; 2 begin 3 while x<>c[x] do x:=c[x]; 4 exit(x); 5 end; 1 private function getfat(x:longint):longint; 2 begin 3 if x<>c[x] then exit(getfat(c[x])) else exit(x

Codeforces Round #360 (Div. 1) D. Dividing Kingdom II 并查集求奇偶元环

D. Dividing Kingdom II Long time ago, there was a great kingdom and it was being ruled by The Great Arya and Pari The Great. These two had some problems about the numbers they like, so they decided to divide the great kingdom between themselves. The

Codeforces 278C Learning Languages(并查集) 求连通块

Codeforces 278C Learning Languages(并查集) 求连通块 为什么最后还要getfather 一遍 比如 x 是 y 的父亲 然后你 Union(x,z) 然后 z 变成了 x 父亲 然后 y 的祖先就是错的了 题解 求一个无向图中有几个连通块 sum 特判 一下 如果 每一个人的语言都为 0 则答案为 sum 其他 答案则为 sum - 1 1 #include <bits/stdc++.h> 2 using namespace std ; 3 4 const

任意点~并查集求联通块

链接:https://www.nowcoder.com/acm/contest/84/C来源:牛客网 任意点 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 平面上有若干个点,从每个点出发,你可以往东南西北任意方向走,直到碰到另一个点,然后才可以改变方向. 请问至少需要加多少个点,使得点对之间互相可以到达. 输入描述: 第一行一个整数n表示点数( 1 <= n <= 100).第二行n行,