LA 6187 - Never Wait for Weights 并查集的带权路径压缩
只有一个地方需要注意:
设节点a的根为u,b的跟为v,则:a = u + d[a]; b = v + d[b];
已知:b-a=w。所以v - u = d[a] - d[b] + w;
在合并两个集合修改根节点时,把v的根改为u,同时v到根的距离为d[a] - d[b] + w;
#include <cstdio>
#include <cstring> const int MAXN = ; int pa[MAXN];
long long int d[MAXN]; int findset( int x )
{
if ( pa[x] == x ) return x;
int root = findset( pa[x] );
d[x] += d[ pa[x] ];
return pa[x] = root;
} int main()
{
int N, M;
while ( scanf( "%d%d", &N, &M ), N || M )
{
for ( int i = ; i <= N; ++i )
{
pa[i] = i;
d[i] = ;
}
while ( M-- )
{
char op[];
scanf( "%s", op );
int a, b, w;
if ( op[] == '!' )
{
scanf( "%d%d%d", &a, &b, &w );
int u = findset(a);
int v = findset(b);
pa[v] = u;
d[v] = d[a] - d[b] + w;
}
else
{
scanf( "%d%d", &a, &b );
int u = findset(a);
int v = findset(b);
if ( u != v ) puts("UNKNOWN");
else printf( "%lld\n", d[b] - d[a] );
}
}
}
return ;
}
LA 6187 - Never Wait for Weights 并查集的带权路径压缩的更多相关文章
- HDU 3038 How Many Answers Are Wrong 并查集带权路径压缩
思路跟 LA 6187 完全一样. 我是乍一看没反应过来这是个并查集,知道之后就好做了. d[i]代表节点 i 到根节点的距离,即每次的sum. #include <cstdio> #in ...
- BZOJ4025 二分图 分治 并查集 二分图 带权并查集按秩合并
原文链接http://www.cnblogs.com/zhouzhendong/p/8683831.html 题目传送门 - BZOJ4025 题意 有$n$个点,有$m$条边.有$T$个时间段.其中 ...
- hdu 2818(并查集,带权更新)
Building Block Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 并查集模板 && 带权并查集模板
不带权: ]; void init(void) { ;i<=n;i++) f[i]=i; } int fd(int x) { return f[x]==x?x:fd[x]=fd(f[x]); } ...
- AcWing:240. 食物链(扩展域并查集 or 带边权并查集)
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形. A吃B, B吃C,C吃A. 现有N个动物,以1-N编号. 每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用 ...
- 算法竞赛进阶指南0x41并查集
并查集简介 并查集的两类操作: Get 查询任意一个元素是属于哪一个集合. Merge 把两个集合合并在一起. 基本思想:找到代表元. 注意有两种方法: 使用一个固定的值(查询方便,但是在合并的时候需 ...
- 并查集&线段树&树状数组&排序二叉树
超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11 ...
- POJ1703Find them, Catch them[种类并查集]
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42416 Accepted: ...
- 数据结构与算法分析 – Disjoint Set(并查集)
什么是并查集?并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题. 并查集的主要操作1.合并两个不相交集合2.判断两个元素是否属于同一集合 主要操作的解释 ...
随机推荐
- OpenNMS架构介绍
一.OpenNMS简介 OpenNMS的开发基于TMN及FCAPS这两个模型. 电信管理网络(TMN)是由 ITU-T 推荐 M.3000于1985年提出作为一种应用于电信服务供应商所持有的运营支持系 ...
- static与全局与局部变量的区别
转自:http://www.cnblogs.com/lzjsky/archive/2010/11/19/1882064.html 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变 ...
- boost-内存管理(scoped_array)
# include <algorithm> string *p=new string[20]; scoped_array<string> sp(p); fill_ ...
- Asp.Net MVC使用ViewData导致双引号被转义的解决方法
使用以下方法进行输出 @Html.Raw(ViewData["jsonString"].ToString())
- net windows Kafka
net windows Kafka 安装与使用入门(入门笔记) 完整解决方案请参考: Setting Up and Running Apache Kafka on Windows OS 在环境搭建 ...
- ASP.NET Web - 开篇
ASP.NET运行库 服务器系统上需要ASP.NET运行库.如果系统上有IIS,就会在安装.NET Framework时为服务器配置ASP.NET运行库.开发过程中,不需要IIS,因为VS发布了自己的 ...
- SSH与EJB 比较
SSH完全的开源产品,如果用SSH就必然会用到大量的开源的东东,从数据库到逻辑到控制到前端,开源产品大拼装, 其中SSH中的三大核心,Struts相当于JSF,spring相当于EJB,hiberna ...
- 查看Linux磁盘空间大小
一.df 命令: df 是来自于coreutils 软件包,系统安装时,就自带的:我们通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置: 举例: [root@localhost beinan ...
- bnuoj 33648 Neurotic Network(树形模拟题)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=33648 [题解]:结果先对MOD*2取模,才能得到结果是否是正确的奇偶问题,得到最后结果之后再对MO ...
- DIV+CSS 基础
盒子模型:margin(边界),可被占位:border(边框):padding(填充):content(内容) 块元素: 默认占据一行,前后换行. 作为容器,装载块元素和行内元素,被装载元素的位置,会 ...