题意:\(有n个人坐在zjnu体育馆里面,然后给出m个他们之间的距离, A B X, 代表B的座位比A多X.\)

\(然后求出这m个关系之间有多少个错误,所谓错误就是当前这个关系与之前的有冲突\)

\(dis[i]\)表示\(i\)到根节点的距离



对于给出的\(l,r,w\)

对应的父节点为\(fl,fr\)

Ⅰ.如果l和r的根节点相同,则判断是否矛盾

如果\(dis[l]-dis[r]==w\)的话就正确,否则错误(对此我的理解是距离越大越靠右,那么l在r左边)

Ⅱ.根节点不同,那么无法判断,则合并

合并时我们是把\(fl\)指向\(fr\),根据向量关系得到\(dis[fl]=-dis[l]+dis[r]+w;\)

最后,find操作压缩路径一直累加到根节点就可以了。

#include <bits/stdc++.h>
using namespace std;
const int maxn=50009;
int n,pre[maxn],dis[maxn],m,a[maxn];
int find(int x){
if(x==pre[x]) return x;
int fa=pre[x];
pre[x]=find(pre[x]);
dis[x]+=dis[fa];
return pre[x];
}
int main()
{
while(cin>>n>>m)
{
int ans=0;
memset(dis,0,sizeof(dis));
for(int i=1;i<=n;i++) pre[i]=i;
for(int i=1;i<=m;i++)
{
int l,r,w;
scanf("%d%d%d",&l,&r,&w);
//r比l多w
int fl=find(l),fr=find(r);
if(fl==fr&&dis[l]-dis[r]!=w) ans++;
else if(fl!=fr)
{
pre[fl]=fr;//f1的祖先变化了
dis[fl]=-dis[l]+dis[r]+w;
}
}
cout<<ans<<endl;
}
}

HDU 3038 (向量图解)的更多相关文章

  1. 类似区间计数的种类并查集两题--HDU 3038 & POJ 1733

    1.POJ 1733 Parity game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5744   Accepted: ...

  2. hdu 3038(扩展并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038 题意:给出区间[1,n],下面有m组数据,l r v区间[l,r]之和为v,每输入一组数据,判断 ...

  3. HDU 3038 - How Many Answers Are Wrong - [经典带权并查集]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  4. hdu 3038 How Many Answers Are Wrong(并查集的思想利用)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038 题意:就是给出n个数和依次m个问题,每个问题都是一个区间的和,然后问你这些问题中有几个有问题,有 ...

  5. HDU 3038

    http://acm.hdu.edu.cn/showproblem.php?pid=3038 题意:[1-n]的区间,有m个询问,每个询问表示[a,b]的和是s,问一共有多少组矛盾 sum[i]表示i ...

  6. hdu 3038 How Many Answers Are Wrong

    http://acm.hdu.edu.cn/showproblem.php?pid=3038 How Many Answers Are Wrong Time Limit: 2000/1000 MS ( ...

  7. (并查集 添加关系)How Many Answers Are Wrong --Hdu --3038

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=3038 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  8. HDU 3038 How Many Answers Are Wrong 【YY && 带权并查集】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=3038 How Many Answers Are Wrong Time Limit: 2000/1000 ...

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

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

随机推荐

  1. 数据结构和算法(Golang实现)(4)简单入门Golang-结构体和方法

    结构体和方法 一.值,指针和引用 我们现在有一段程序: package main import "fmt" func main() { // a,b 是一个值 a := 5 b : ...

  2. 数据结构和算法(Golang实现)(10)基础知识-算法复杂度主方法

    算法复杂度主方法 有时候,我们要评估一个算法的复杂度,但是算法被分散为几个递归的子问题,这样评估起来很难,有一个数学公式可以很快地评估出来. 一.复杂度主方法 主方法,也可以叫主定理.对于那些用分治法 ...

  3. 练习,自定义TextView(1.1)

    重新自定义TextView是非常有趣的事情,跟着Android4高级编程,通过自定义TextView,来敲一下代码: 这个是那么的简单,自定义TextView,新建CustomTextView继承Te ...

  4. tensorflow1.0 placeholder占位符

    import tensorflow as tf #(tf.float32,[2,2]) input1 = tf.placeholder(tf.float32) input2 = tf.placehol ...

  5. Ubuntu中安装Hadoop

    安装前 1,更新apt sudo apt-get update   会让你输入密码(自己登录Ubuntu的时候设置的),输入密码不会显示在终端面板上,确定自己敲对之后点回车就行. 2,安装SSH服务器 ...

  6. Python自学从入门到就业之函数基础(小白必看)

    函数介绍 <1>什么是函数 请看如下代码: print(" _ooOoo_ ") print(" o8888888o ") print(" ...

  7. 二叉树中两节点的最近公共父节点(360的c++一面问题)

    面试官的问题:写一个函数  TreeNode* Find(TreeNode* root, TreeNode* p, TreeNode* q) ,返回二叉树中p和q的最近公共父节点. 本人反应:当时有点 ...

  8. [go]包和工程管理

    一.系统环境变量 GOROOT 指定go的安装目录,win是在 C\Go\,Linux在 /usr/local/go下,如果不是默认的目录,则需要指定 GOROOT环境变量,否则不需要 GOPATH ...

  9. c++ 更新 performance counter 数据,错误码 87

    ERROR_INVALID_PARAMETER 87 (0x57) The parameter is incorrect. 很可能是该送 ULONG 的送了 ULONGLONG,vise versa

  10. 非阻塞算法(Lock-Free)的实现

    目录 非阻塞的栈 非阻塞的链表 非阻塞算法(Lock-Free)的实现 上篇文章我们讲到了使用锁会带来的各种缺点,本文将会讲解如何使用非阻塞算法.非阻塞算法一般会使用CAS来协调线程的操作. 虽然非阻 ...