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 ...
随机推荐
- 面向对象的PHP
类的实例(包括继承) <?php // 父类 class Animal { public $name; public $age; // 构造函数,使用new操作符生成实例的时候自动调用 func ...
- sprintf_s的教训
sprintf_s 是个比sprintf更安全的函数,今天在使用的过程中犯了个错误,代码的大致意思如下 void Test_sprintf_s() { ]; memset(buff, , sizeof ...
- Spring3+Mybatis3+Mysql+ivy+liquibase
Spring3+Mybatis3+Mysql+ivy+liquibase 集成 近一周时间所学技术:整合Spring+MyBatis+MySql+ivy+liquibase Mybatis:是一个基于 ...
- android之MP3播放器(1)
该播放器只是对本地的MP3文件进行简单的播放 布局文件 布局文件中设置了三个按钮分别来进行播放.暂停和继续播放 <?xml version="1.0" encoding=&q ...
- Beta项目冲刺--第三天
又找回熟悉的感觉.... 队伍:F4 成员:031302301 毕容甲 031302302 蔡逸轩 031302430 肖阳 031302418 黄彦宁 会议内容: 1.站立式会议照片: 2.项目燃尽 ...
- hello Cookie
Cookie 是什么? Cookie在浏览器中的表现为请求头域和响应头域的字段,也就是伴随着请求和响应的一组键值对的文本.Cookie来源于服务器,第一次请求无Cookie参数,增加Cookie通过服 ...
- [Google Guava]学习--缓存cache
适用性 缓存在很多情况下非常实用.例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存. Guava Cache与ConcurrentMap很相似,但也不完全 ...
- js call与apply方法
js中所有函数都默认定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是this的值,剩余的参数是需要传递给函数的值,call与a ...
- js-处理回车事件
/**回车 */ function enterkey() { //兼容IE或其它其它浏览器 var event = arguments[0] || window.event; //兼容IE或其它浏览器 ...
- 【SPOJ QTREE2】QTREE2 - Query on a tree II(LCA)
You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, ...