hdu3038(带权并查集)
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038
题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示从第x,个元素到第y个元素的和为d(包括x, 和y), 问m行输入里面有几个是错误的(第一个输入是正确的);
思路: 很显然带权并查集咯,我们可以用距离的概念代替和的概念比较好理解一点,d表示x到y的和即x到y的距离;
可以用rank[x]表示x到其父亲节点的距离, 将正确的距离关系合并到并查集中(错误的当然不能合并到里面啦);
要注意的是这里的x, y是闭区间, 我们不好直接处理, 要先将其变成开区间来, [x, y]等价于(x-1, y]或者[x, y+1);
还有要注意有多组输入(坑爹)......
代码:
#include <iostream>
#include <stdio.h>
#define MAXN 200010
using namespace std; int pre[MAXN], ran[MAXN]; int find(int x){
if(x!=pre[x]){
int fx=find(pre[x]);
ran[x]=ran[x]+ran[pre[x]]; //***路径压缩过程中更新rank的值, 至于这个更新的公式嘛画线段图很容易看出来的啦
pre[x]=fx;
}
return pre[x];
} int jion(int x, int y, int d){
int fx=find(x);
int fy=find(y);
if(fx==fy){ // **路径压缩后fx,fy即为x, y的父亲节点, 如果他们父亲节点相同的话我们就可以判断是否与并查集里面的关系矛盾,这个我们也可以画线段图看出来啦
if(ran[x]-ran[y]!=d){
return ;
}
}else{ //***合并后更新rank值, 和前面一样画线段图就OK了啦
if(fx<fy){
pre[fx]=fy;
ran[fx]=ran[y]+d-ran[x];
}else{
pre[fy]=fx;
ran[fy]=ran[x]-ran[y]-d;
}
}
return ;
} int main(void){
int n, m, d, x, y, ans=;
while(~ scanf("%d%d", &n, &m)){
ans=;
for(int i=; i<=n; i++){
pre[i]=i;
ran[i]=;
}
while(m--){
scanf("%d%d%d", &x, &y, &d);
if(jion(x, y+, d)){ //注意题目给出的是闭区间, 我们将其化成半开区间来比较好处理
ans++;
}
}
printf("%d\n", ans);
}
return ;
}
hdu3038(带权并查集)的更多相关文章
- BZOJ 1202: [HNOI2005]狡猾的商人 [带权并查集]
题意: 给出m个区间和,询问是否有区间和和之前给出的矛盾 NOIp之前做过hdu3038..... 带权并查集维护到根的权值和,向左合并 #include <iostream> #incl ...
- 种类并查集——带权并查集——POJ1182;HDU3038
POJ1182 HDU3038 这两个题比较像(一类题目),属于带权(种类)并查集 poj1182描绘得三种动物种类的关系,按照他一开始给你的关系,优化你的种类关系网络,最后看看再优化的过程中有几处矛 ...
- 【带权并查集】【HDU3038】【How Many Answers Are Wrong】d s
这个题看了2天!!!最后看到这篇题解才有所明悟 转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4298091.html ---by 墨染之樱 ...
- hdu3038判断区间谎言(带权并查集)
题目传送门 题目描述:给你n,m,n代表从1到n这么大的数组,m组v,u,val,代表v到u这个区间的总和是val,然后让你判断m组关系中有几组是错误的. 思路:带权并查集,这道题其实算是让我知道什么 ...
- HDU3038 How Many Answers Are Wrong —— 带权并查集
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 How Many Answers Are Wrong Time Limit: 200 ...
- HDU-3038 How Many Answers Are Wrong(带权并查集区间合并)
http://acm.hdu.edu.cn/showproblem.php?pid=3038 大致题意: 有一个区间[0,n],然后会给出你m个区间和,每次给出a,b,v,表示区间[a,b]的区间和为 ...
- POJ 1703 Find them, Catch them(带权并查集)
传送门 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42463 Accep ...
- [NOIP摸你赛]Hzwer的陨石(带权并查集)
题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...
- poj1417 带权并查集 + 背包 + 记录路径
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2713 Accepted: 868 Descrip ...
随机推荐
- Call to undefined function mysqli_connect()
PHP5.0后新支持一个mysqli.dll的扩展功能,能让用户更加简洁的调用mysql数据库. 需要在Php.ini配置中将下面代码前的;去掉.extension=php_mysqli.dll
- CSS伪选择器的使用-遁地龙卷风
分为伪元素选择器和伪类选择器两种,前者两个冒号,后者一个冒号,但是浏览器都看做一个冒号 1.a.::first-line 逐层匹配,直到有文本元素且结束改行为止 设置css属性word-break:b ...
- javascript中对象学习
第一篇文章: javascript中this关键字的详细解析: http://blog.csdn.net/wyj880220/article/details/7305952 Javascript ...
- jsp+servlet
- 解决ubuntu每次重启屏幕亮度都重置为最高亮度问题
很多朋友都会碰到这个问题,Ubuntu系统,每次通过系统设置修改了屏幕亮度,重启系统都会将屏幕亮度调成最大值,很是苦恼. 上网搜索一番发现,修改屏幕亮度的文件是:/sys/class/backligh ...
- fzu2188 状压dp
G - Simple String Problem Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & ...
- 2.1---删除链表中重复元素(CC150)
分成两种,1种开了额外空间,临时缓冲区,一种没有开 import java.util.HashSet; import java.util.Set; class ListNode{ int data; ...
- 前端开发必须知道的JS(二) 闭包及应用
http://www.cnblogs.com/ljchow/archive/2010/07/06/1768749.html 在前端开发必须知道的JS(一) 原型和继承一文中说过下面写篇闭包,加之最近越 ...
- 【K8s】Kubernetes 最近正在看的资料
中国移动Kubernetes多集群统一管理实践: http://www.tuicool.com/articles/FrqQrqI#c-22517 一种新的进入容器的方式: WebSocket + D ...
- 【Supervisor】使用 Supervisor source command not found 如何解决
结论: The source command is only available in bash, and the supervisor command is run by sh. I would r ...