hdu 3038 How Many Answers Are Wrong 并查集
2015-07-25 19:45
369 查看
题目大致意思:第一行输入n,m,表示有共有n个数字,下面会有m行操作。每次输入ai,bi,si表示从ai到bi的和为si,最后输出有m次中有几次和上面的有冲突。
!!!!!!sum【x】表示从x的父节点到达x的值
!!!!!!sum【x】表示从x的父节点到达x的值
#include <stdio.h> #include <string.h> using namespace std; const int MAXN=200010; int p[MAXN];//保存每个数字的父节点 int sum[MAXN];//保存每个数字的父节点与自己本身之间的和 int Find(int x) { if(x!=p[x]) { int tmp=Find(p[x]);//保存父节点 sum[x]+=sum[p[x]];//更新本身到达父节点的值 p[x]=tmp; } return p[x]; } int main() { int n,m; int u,v,w; while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) { p[i]=i; } memset(sum,0,sizeof(sum)); int ans=0; while(m--) { scanf("%d%d%d",&u,&v,&w); u=u-1;//让左端点-1可以更好的操作数组,比如u=5,v=8,w=4,那么w是前八个数的和减去前四个数的和 即从第五个数到第八个数的和 int t1=Find(u); int t2=Find(v);//分别找到u,v的父节点。 if(t1!=t2)//不相同表示不在一起 { p[t2]=t1;//合并 sum[t2]=sum[u]-sum[v]+w;//不理解可以画图表示一下 } else { if(sum[v]-sum[u]!=w)//起点相同那么不满足sum[v]-sum[u]==w就是与之前的有冲突 ans++; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- JavaScript中的this(你不知道的JavaScript)
- git 常用命令
- JavaScript中的this(你不知道的JavaScript)
- Quartus II 11.0破发点(不同的是低版本号)
- 随机洗牌算法
- 【Memcached】linux centos 安装memcached和它的常用基本操作
- python : 随机数
- Eclipse JavaEE +Tomcat 搭建web工程 servlet示例
- C++入门经典 笔记(第六章)控制程序流程
- 双向广搜示例:走迷宫1
- 基于MFC框架插件模式
- 编码风格
- 面向对象4
- 笔记
- android studio上imageloader初探
- 面向对象3
- Spring AOP 异常:IllegalArgumentException: error at ::0 can't find referenced pointcut
- Ubuntu中查找与Launcher图标所对应的命令
- hdu 4284——Travel
- 面向对象2