hdu 3536【并查集】
题意:
有N个珠子,第i个珠子初始放在第i个城市。有两种操作: T A B:把A珠子所在城市的所有珠子放到B城市。 Q A:输出A珠子所在城市编号,该城市有多少个珠子,该珠子转移了多少回。
题解:
在基本并查集的基础上需要两个数组,cnt[i]记录第i个珠子所在城市总共有多少个珠子,tans[i]记录第i个珠子转移了多少回。我开始想的是有T操作是我就把tans[A]++。其实这个是存在问题的,如果A B在同一个城市,其实是不需要转移的。后来我又不怎么明白,为什么要在Find()里面更新tans[]。后来想想,有点明白了。拿样例举例: N=3 1 2 3 。当1的父节点连接2时,tans[1]=1,之后再合并 1,3时,是先找1的父节点2,2直接连到3上,此时是把tans[2]++,因此当查询1所在城市有多少个珠子时,需要tans[1]加上它父亲节点的tans[]。这是一个递归的过程。
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e4+;
int f[maxn],cnt[maxn],tans[maxn]; void Init(int n)
{
for(int i=;i<=n;i++){
f[i]=i;cnt[i]=;tans[i]=;//初始时第i个珠子在第i个城市
}
} int Find(int x)
{
if(x==f[x]) return x;
int t=f[x];
f[x]=Find(f[x]);
tans[x]+=tans[t];
return f[x];
} void Union(int a,int b)
{
int x=Find(a),y=Find(b);
if(x==y) return;
f[x]=y;
cnt[y]+=cnt[x];
tans[x]++;
} int main()
{
int T,N,Q,a,b;
char ch;
scanf("%d",&T);
for(int cas=;cas<=T;cas++)
{
printf("Case %d:\n",cas);
scanf("%d%d",&N,&Q);
Init(N);
while(Q--)
{
scanf(" %c",&ch);
if(ch=='T'){
scanf("%d%d",&a,&b);
Union(a,b);
}else{
scanf("%d",&a);
int t=Find(a);
printf("%d %d %d\n",t,cnt[t],tans[a]);//cnt[]输出的根节点的
}
}
}
return ;
}
hdu 3536【并查集】的更多相关文章
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- HDU 3926 并查集 图同构简单判断 STL
给出两个图,问你是不是同构的... 直接通过并查集建图,暴力用SET判断下子节点个数就行了. /** @Date : 2017-09-22 16:13:42 * @FileName: HDU 3926 ...
- HDU 4496 并查集 逆向思维
给你n个点m条边,保证已经是个连通图,问每次按顺序去掉给定的一条边,当前的连通块数量. 与其正过来思考当前这边会不会是桥,不如倒过来在n个点即n个连通块下建图,检查其连通性,就能知道个数了 /** @ ...
- HDU 1232 并查集/dfs
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1232 我的第一道并查集题目,刚刚学会,我是照着<啊哈算法>这本书学会的,感觉非常通俗易懂,另 ...
- HDU 2860 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=2860 n个旅,k个兵,m条指令 AP 让战斗力为x的加入y旅 MG x旅y旅合并为x旅 GT 报告x旅的战斗力 ...
- hdu 1198 (并查集 or dfs) Farm Irrigation
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1198 有题目图11种土地块,块中的绿色线条为土地块中修好的水渠,现在一片土地由上述的各种土地块组成,需要浇 ...
- hdu 1598 (并查集加贪心) 速度与激情
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1598 一道带有贪心思想的并查集 所以说像二分,贪心这类基础的要掌握的很扎实才行. 用结构体数组储存公 ...
- hdu 4496(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4496. 思路:简单并查集应用,从后往前算就可以了. #include<iostream> ...
- 2015多校第6场 HDU 5361 并查集,最短路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5361 题意:有n个点1-n, 每个点到相邻点的距离是1,然后每个点可以通过花费c[i]的钱从i点走到距 ...
- HDU 1856 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=1856 More is better Time Limit: 5000/1000 MS (Java/Others) ...
随机推荐
- 关于开启Eureka安全Security认证后,客户端死活注册不上的问题
遇到一个问题"开启Eureka服务端的安全认证后,客户端死活注册不到Eureka上",已经尝试了以下办法,完全搞不定... 客户端出错的版本: spring-boot:2.0.3. ...
- python的collections应用为字典哈希
import collections allNum=collections.defaultdict(int) allNum[1]+=1 allNum[5]+=1 print(allNum) 当然,de ...
- H5C3--属性选择器、兄弟选择器、伪类选择器
属性选择器 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 调用本地摄像头并通过canvas拍照
首先我们需要新建一个video标签,并且放到html里边 var video = document.createElement("video"); video.autoplay=& ...
- OpenLayers使用symbolizers样式特征
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...
- Eclipse 遇到的问题和快捷键记录
一.the user operation is waiting: 选择菜单栏的"Project",然后把菜单栏中"Build Automatically"前面的 ...
- NFS挂载服务具体的实施方案
1.服务器磁盘共享实施方案 第一步:安装NFS和rpc. 1. 安装nfs-utils:NFS主程序,rpcbind:PRC主程序 nfs-utils:NFS主程序,包含rpc.nfsd rpc.m ...
- Boost Asio教程集合
http://zh.highscore.de/cpp/boost/ 第七章 https://mmoaay.gitbooks.io/boost-asio-cpp-network-programming- ...
- Linux系统下实现远程连接MySQL数据库的方法教程
1.在服务器端开启远程访问首先进入mysql数据库,然后输入下面两个命令: grant all privileges on *.* to 'root'@'%' identified by 'passw ...
- Vim 中自定义注释快捷键
写程序的时候写过的代码不忍心立马删掉,所以注释很多,所以找了下注释的快捷健. 打开 /etc/vim/vimrc文件,添加如下两行代码即可. /* 注释该行 */ map = I/* ^[A */j ...