hdu 3047–Zjnu Stadium(带权并查集)
题目大意:
有n个人坐在zjnu体育馆里面,然后给出m个他们之间的距离, A B X, 代表B的座位比A多X. 然后求出这m个关系之间有多少个错误,所谓错误就是当前这个关系与之前的有冲突。
分析:
首先我们假设所有节点均在不同行的0位置,即rank[]初始化需为零,同时p[]需要初始化为-1,表示各个节点之间不存在联系,相互独立;
接下来,我们获取信息:A B X;那么我们需要检查 :
1. 如果A B的father相同,那么说明前面的一组(A B X)直接或者间接地更新了A B间的距离,我们便需要检查已经存在距离,和最新输入的X是否相违背;
2. 如果A B的father不相同,那么是否能直接把B以及与B同在一个集合的元素加入A所在的集合,而不发生冲突呢?
这里的冲突指的是:假设节点1是根节点,已知节点2距离节点1 200m,现在读取新的输入:1 3 200 。我们发现,节点2,3到达节点1 的距离相同,同一个位置上出现了两个节点,这显然与题意相违背,即冲突。
【问题】假设我们发现A属于ra集合,B属于rb集合,如何合并两个独立的集合ra,rb?
\[merge\left\{ {A,B|A \in ra,B \in rb} \right\}\]
事实上将集合rb并入集合ra是容易的,但是我们需要更新集合rb中的rank[],因为根元素变化了。
现在集合rb中的根元素的rank值不再是0了(自己到自己的距离为0),而是变成了该根元素到达ra集合中的根元素的距离。
假设输入为 A B X,rb为B所在集合的根元素,那么该根元素的更新公式为:
\[rank\left[ {rb} \right] = \left( {rank\left[ A \right] + rank\left[ B \right] + X + 300} \right)\% 300\]【问题】那么rb集合中的剩下的元素如何更新?何时更新?
我们可以在下一次的find操作中更新集合rb中的距离值,这样的话,通过路径压缩的方法,我们可以实现:
集合rb中的元素的father指向集合ra中的根元素,集合rb中的元素的rank表示距离集合ra中的根元素的距离。
更新公式:(x为当前节点,p[x]表示x的父节点)
\[rank\left[ x \right] = \left( {rank\left[ x \right] + rank\left[ {p\left[ x \right]} \right]} \right)\% 300\]
题解:
#include<iostream>
#include<cstdio>
using namespace std;
#define MOD 300
#define maxn 50001
int p[maxn];
int rank[maxn];
void init(int n){
memset(p,-1,sizeof(p));
memset(rank,0,sizeof(rank));
}
int find(int x){
if(p[x]==-1)
return x;
else{
int tmp=p[x];
p[x]=find(p[x]);
rank[x]=(rank[x]+rank[tmp])%MOD;
return p[x];
}
}
bool judge(int a,int b){
return find(a)==find(b);
} bool Union(int a,int b,int x){
int ra=find(a);
int rb=find(b);
if(ra==rb){
if((rank[b]-rank[a]+MOD)%MOD!=x)
return false;
return true;
}
rank[rb]=(rank[a]-rank[b]+x+MOD)%MOD;
p[rb]=ra;
return true;
} int main(){
int n,m;
while(scanf("%d %d",&n,&m)!=EOF){
int a,b,x;
int cnt=0;
init(n);
while(m--){
scanf("%d %d %d",&a,&b,&x);
if(!Union(a,b,x))
cnt++;
}
printf("%d\n",cnt);
}
}
hdu 3047–Zjnu Stadium(带权并查集)的更多相关文章
- HDU 3047 Zjnu Stadium(带权并查集)
题意:有一个环形体育场,有n个人坐,给出m个位置关系,A B x表示B所在的列在A的顺时针方向的第x个,在哪一行无所谓,因为假设行有无穷个. 给出的座位安排中可能有与前面矛盾的,求有矛盾冲突的个数. ...
- Hdu 2047 Zjnu Stadium(带权并查集)
Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 3047 Zjnu Stadium(加权并查集)2009 Multi-University Training Contest 14
题意: 有一个运动场,运动场的坐席是环形的,有1~300共300列座位,每列按有无限个座位计算T_T. 输入: 有多组输入样例,每组样例首行包含两个正整数n, m.分别表示共有n个人,m次操作. 接下 ...
- HDU3047 Zjnu Stadium 带权并查集
转:http://blog.csdn.net/shuangde800/article/details/7983965 #include <cstdio> #include <cstr ...
- hdu 5441 Travel 离线带权并查集
Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 De ...
- How Many Answers Are Wrong (HDU - 3038)(带权并查集)
题目链接 并查集是用来对集合合并查询的一种数据结构,或者判断是不是一个集合,本题是给你一系列区间和,判断给出的区间中有几个是不合法的. 思考: 1.如何建立区间之间的联系 2.如何发现悖论 首先是如何 ...
- hdu 5441 travel 离线+带权并查集
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem Descript ...
- hdu 2818 Building Block (带权并查集,很优美的题目)
Problem Description John are playing with blocks. There are N blocks ( <= N <= ) numbered ...N ...
- hdu 3635 Dragon Balls (带权并查集)
Dragon Balls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
随机推荐
- Web性能优化-合并js与css,减少请求
Web性能优化已经是老生常谈的话题了, 不过笔者也一直没放在心上,主要的原因还是项目的用户量以及页面中的js,css文件就那几个,感觉没什么优化的.人总要进步的嘛,最近在被angularjs吸引着,也 ...
- j-link或者swd调试
两种 一.JTAG调试(5针), 二.SWD调试(2针), 在JTAG/SWD模式设置库函数 (在文件stm32f10x_gpio.c中): void GPIO_PinRemapConfig(uint ...
- MATLAB中白噪声的WGN和AWGN函数的使用
MATLAB中白噪声的WGN和AWGN函数的使用如下: MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一 信号 ...
- UEFI与MBR区别
EFI与MBR启动的区别 大硬盘和WIN8系统,让我们从传统的BIOS+MBR模式升级到UEFI+GPT模式,现在购买的主流电脑,都是预装WIN8系统,为了更好的支持2TB硬盘 ,更快速的启动win ...
- 在Go语言中使用JSON(去掉空字段)
Encode 将一个对象编码成JSON数据,接受一个interface{}对象,返回[]byte和error: func Marshal(v interface{}) ([]byte, error) ...
- context:component-scan扫描使用的use-default-filters
如下方式可以成功扫描到@Controller注解的Bean,不会扫描@Service/@Repository的Bean. <context:component-scan base-package ...
- MyBatis学习--查询缓存
简介 以前在使用Hibernate的时候知道其有一级缓存和二级缓存,限制ORM框架的发展都是互相吸收其他框架的优点,在Hibernate中也有一级缓存和二级缓存,用于减轻数据压力,提高数据库性能. m ...
- [oracle] 解决ORA-30036:无法按8扩展段(在还原表空间‘XXXX’中)
select * from dba_data_files awhere a.TABLESPACE_NAME='UNDOTBS' alter tablespace UNDOTBS add datafil ...
- Django form 中文提交 错误
在文件头部添加 刻解决 import sys reload(sys) sys.setdefaultencoding("utf-8")
- git 删除和重命名文件
1. 删除文件 git rm a.txt git rm--cached filename 会删除索引中的文件并把它保留在工作目录中 而 git rm 则会将文件从索引和工作目录中都删除 文件删除后的恢 ...