题目大意:

有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(带权并查集)的更多相关文章

  1. HDU 3047 Zjnu Stadium(带权并查集)

    题意:有一个环形体育场,有n个人坐,给出m个位置关系,A B x表示B所在的列在A的顺时针方向的第x个,在哪一行无所谓,因为假设行有无穷个. 给出的座位安排中可能有与前面矛盾的,求有矛盾冲突的个数. ...

  2. Hdu 2047 Zjnu Stadium(带权并查集)

    Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. hdu 3047 Zjnu Stadium(加权并查集)2009 Multi-University Training Contest 14

    题意: 有一个运动场,运动场的坐席是环形的,有1~300共300列座位,每列按有无限个座位计算T_T. 输入: 有多组输入样例,每组样例首行包含两个正整数n, m.分别表示共有n个人,m次操作. 接下 ...

  4. HDU3047 Zjnu Stadium 带权并查集

    转:http://blog.csdn.net/shuangde800/article/details/7983965 #include <cstdio> #include <cstr ...

  5. hdu 5441 Travel 离线带权并查集

    Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 De ...

  6. How Many Answers Are Wrong (HDU - 3038)(带权并查集)

    题目链接 并查集是用来对集合合并查询的一种数据结构,或者判断是不是一个集合,本题是给你一系列区间和,判断给出的区间中有几个是不合法的. 思考: 1.如何建立区间之间的联系 2.如何发现悖论 首先是如何 ...

  7. hdu 5441 travel 离线+带权并查集

    Time Limit: 1500/1000 MS (Java/Others)  Memory Limit: 131072/131072 K (Java/Others) Problem Descript ...

  8. hdu 2818 Building Block (带权并查集,很优美的题目)

    Problem Description John are playing with blocks. There are N blocks ( <= N <= ) numbered ...N ...

  9. hdu 3635 Dragon Balls (带权并查集)

    Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

随机推荐

  1. 【动态域名解析工具】tunnel,国内版的ngrok,花生壳可以睡觉了

    在笔者的系列微信开发教程中,有一个比较基础且重要的一节:微信开发的调试.在文章中我推荐了两种动态域名解析的工具用于将本地的开发环境部署成服务器,一种是花生壳,一种是ngrok,但毕竟我等屌丝用不起或者 ...

  2. 创建多个Oracle数据库及相应的实例

    转 http://blog.csdn.net/luiseradl/article/details/6972217 对于使用过SQL Server数据库的用户可以会对Oracle中的数据库的实例的概念理 ...

  3. 关于Hibernate的sequence diagram

  4. 在iOS中实现类似安卓自动消失提示框

    类方法: + (void)showMessage:(NSString *)message { // 获取window UIWindow *window = [UIApplication sharedA ...

  5. lineNumber: 1; columnNumber: 1; 前言中不允许有内容

    周六项目还能运行,也没修改什么,周一来了启动项目,竟然报错了~~~ 这是遇到的错误提示: Cause: org.xml.sax.SAXParseException; lineNumber: 1; co ...

  6. eclipse的插件安装

    如何安装:http://my.oschina.net/linjunlong/blog/126961 插件安装方法:eclipse和myeclipse版本不一样,略有区别 在线安装: 第一种:知道在线安 ...

  7. extjs 箱子布局

    a.flex 配置项 flex 配置项不是设置在布局上,而是设置在子项的配置项.每个子项相对的 flex 值都会与全体子项 flex 累加的值相比较,根据此结果,处理每个子项的 flex 最后是多少. ...

  8. 50ms延时程序

    12MHz晶振 一个机器周期2us, DEL:  MOV  R7,#200D DEL1: MOV R6,#125 DEL2: DJNZ R6,DEL2 ;125*2=250us DJNZ  R7,DE ...

  9. Android 自定义Popupwindow 注意事项,手机和平板的区别

    首先自定义ppw是要继承Popupwindow 的 而要成功的显示出自定义的ppw就必须实现下面的三句代码 // 必要的三要素下面,不然popWind显示不出来 this.setContentView ...

  10. ActiveMQ(七)_伪集群和主从高可用使用

      一.本文目的         介绍如何在同一台虚拟机上搭建高可用的Activemq服务,集群数量包含3个Activemq,当Activemq可用数>=2时,整个集群可用.         本 ...