HDU 3635 Dragon Balls(超级经典的带权并查集!!!新手入门)
Dragon Balls
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7926 Accepted Submission(s): 2937

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.
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)
3 3
T 1 2
T 3 2
Q 2
3 4
T 1 2
Q 1
T 1 3
Q 1
2 3 0
Case 2:
2 2 1
3 3 2
给你n个物品,从1到n编号
现在对n有m个操作
T A B 把A所在集合的物品全部移到B所在的集合(移动的物品包括A)
Q X 问你X所在集合的编号,x所在集合的结点数量,和x移到的次数
比如样例1:1移到2,然后3移到2,因为是移到2,所以集合编号就是2,注意理解
此时Q 1,那么1所在集合编号就是2,因为是移到2去的,1所在集合的结点数量是3
那么此时1的移到此时是1
#include<queue>
#include<set>
#include<cstdio>
#include <iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<string>
#include<string.h>
#include<memory>
using namespace std;
#define max_v 10005
#define INF 9999999
int pa[max_v];
int num[max_v];//num[i] i所在集合内含有结点个数
int mov[max_v];//mov[i] i移动的次数
int n,m;
void init()
{
for(int i=; i<=n; i++)
{
pa[i]=i;
num[i]=;
mov[i]=;
}
}
int find_set(int x)
{
if(pa[x]!=x)
{
int t=pa[x];
pa[x]=find_set(pa[x]);
mov[x]+=mov[t];//孩子结点的移动次数会与其父亲结点移动次数相关
}
return pa[x];
}
void union_set(int x,int y)
{
int fx=find_set(x);
int fy=find_set(y); if(fx!=fy)
{
pa[fx]=fy;
num[fy]+=num[fx];//合并之后大集合的结点数等于原来两个小集合结点数目之和
mov[fx]++;//x的根结点 移动次数++ x的移动次数在find_set函数里面更新
}
}
int main()
{
int t;
int x,y;
char str[];
int c=;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
init();
printf("Case %d:\n",c++);
for(int i=; i<m; i++)
{
scanf("%s",str);
if(str[]=='T')
{
scanf("%d %d",&x,&y);
union_set(x,y);
}
else if(str[]=='Q')
{
scanf("%d",&x);
int k=find_set(x);
printf("%d %d %d\n",k,num[k],mov[x]);
}
}
}
return ;
}
/*
题目意思:
给你n个物品,从1到n编号
现在对n有m个操作
T A B 把A所在集合的物品全部移到B所在的集合(移动的物品包括A)
Q X 问你X所在集合的编号,x所在集合的结点数量,和x移到的次数 注意:
比如样例1:1移到2,然后3移到2,因为是移到2,所以集合编号就是2,注意理解
此时Q 1,那么1所在集合编号就是2,因为是移到2去的,1所在集合的结点数量是3
那么此时1的移到此时是1 注意理解移动次数数组 具体参考代码
*/
HDU 3635 Dragon Balls(超级经典的带权并查集!!!新手入门)的更多相关文章
- HDU Virtual Friends(超级经典的带权并查集)
Virtual Friends Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU 3047 带权并查集 入门题
Zjnu Stadium 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3047 Problem Description In 12th Zhejian ...
- HDU 1829 A Bug's Life 【带权并查集/补集法/向量法】
Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes ...
- hdu 3038 How Many Answers Are Wrong ( 带 权 并 查 集 )
How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 3038 How Many Answers Are Wrong(带权并查集)
太坑人了啊,读入数据a,b,s的时候,我刚开始s用的%lld,给我WA. 实在找不到错误啊,后来不知怎么地突然有个想法,改成%I64d,竟然AC了 思路:我建立一个sum数组,设i的父亲为fa,sum ...
- HDU 3038 - How Many Answers Are Wrong - [经典带权并查集]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- 洛谷 1196 [NOI2002]银河英雄传说【模板】带权并查集
[题解] 经典的带权并查集题目. 设cnt[i]表示i前面的点的数量,siz[i]表示第i个点(这个点是代表元)所处的联通块的大小:合并的时候更新siz.旧的代表元的cnt,路径压缩的时候维护cnt即 ...
- 并查集例题02.带权并查集(poj1182)
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底 ...
- hdu 5441 Travel 离线带权并查集
Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 De ...
随机推荐
- Java与C++区别:重载(Overloading)
Java中一个类的函数重载可以在本类中的函数和来自父类中的函数之间进行,而C++类中的函数重载只能是本类中的(即不包括来自父类的函数),这是他们一个非常重要的区别.在其他方面的要求都是一致的,即要求函 ...
- Sspring bean被初始化加载2次
Sspring bean被初始化加载2次 spring框架的web项目时,启动的时候发现某个bean被加载了两次,比如使用SchedulingConfigurer或者使用@PostConstruct的 ...
- 使用css实现三角符号
关于使用css制作三角符号,网上有很多的例子了,在这里只是为了详细的向各位解释一下三角符号的原理 下图,是一个长宽为100px,边框宽度为100px的一个元素,由此可见,在css中上下左右的边框相交处 ...
- java三元运算符
由?:符号表示的,具体的含义其实就和if-else结构的含义差不多,这种运算符会将某个条件作两种处理,如果满足条件的话就执行第一个结果,如果不满足的话就执行另外一个结果,例如: Int A,B,C; ...
- Javascript 中正则表达式验证网址
其中ItemURL是需要验证的网址数据
- N个必备的实用jQuery代码段
jQuery(function() { /* <input type="password" name="pass" id="pass" ...
- redis使用方式
关于Jedis连接Linux上的redis出现 DENIED Redis is running in protected mode问题的解决方案 1.修改redis.conf配置文件,将绑定的ip地址 ...
- MSSQL->serverlink[Oracle]
需求描述: SQL Server数据库连接Oracle数据库 条件准备: SQL Server数据库,SQL Server 2008R2 Oracle数据库,Oracle ...
- 网络编程进阶---->>> hamc模块 socketserver模块验证合法性 两者进行通信连接
我们在工作中经常遇到,你公司内的某一台电脑要去访问你的服务器或者一个服务端电脑,那么你是让每一台都进行连接吗? 那不可能的 你肯定要进行限定的 验证客户端链接的合法性: hamc模块 hamc也是 ...
- Python学习---面向对象的学习[基础]
面向对象 面向对象的三大特性是指:封装.继承和多态. 说明: Python可以函数式编程,也可以面向对象编程 l 面向过程:根据业务逻辑从上到下写垒代码 l 函数式 :将某功能代码封装到函数中,日后便 ...