只有一个地方需要注意:

设节点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;

  1. #include <cstdio>
  2. #include <cstring>
  3.  
  4. const int MAXN = ;
  5.  
  6. int pa[MAXN];
  7. long long int d[MAXN];
  8.  
  9. int findset( int x )
  10. {
  11. if ( pa[x] == x ) return x;
  12. int root = findset( pa[x] );
  13. d[x] += d[ pa[x] ];
  14. return pa[x] = root;
  15. }
  16.  
  17. int main()
  18. {
  19. int N, M;
  20. while ( scanf( "%d%d", &N, &M ), N || M )
  21. {
  22. for ( int i = ; i <= N; ++i )
  23. {
  24. pa[i] = i;
  25. d[i] = ;
  26. }
  27. while ( M-- )
  28. {
  29. char op[];
  30. scanf( "%s", op );
  31. int a, b, w;
  32. if ( op[] == '!' )
  33. {
  34. scanf( "%d%d%d", &a, &b, &w );
  35. int u = findset(a);
  36. int v = findset(b);
  37. pa[v] = u;
  38. d[v] = d[a] - d[b] + w;
  39. }
  40. else
  41. {
  42. scanf( "%d%d", &a, &b );
  43. int u = findset(a);
  44. int v = findset(b);
  45. if ( u != v ) puts("UNKNOWN");
  46. else printf( "%lld\n", d[b] - d[a] );
  47. }
  48. }
  49. }
  50. return ;
  51. }

LA 6187 - Never Wait for Weights 并查集的带权路径压缩的更多相关文章

  1. HDU 3038 How Many Answers Are Wrong 并查集带权路径压缩

    思路跟 LA 6187 完全一样. 我是乍一看没反应过来这是个并查集,知道之后就好做了. d[i]代表节点 i 到根节点的距离,即每次的sum. #include <cstdio> #in ...

  2. BZOJ4025 二分图 分治 并查集 二分图 带权并查集按秩合并

    原文链接http://www.cnblogs.com/zhouzhendong/p/8683831.html 题目传送门 - BZOJ4025 题意 有$n$个点,有$m$条边.有$T$个时间段.其中 ...

  3. hdu 2818(并查集,带权更新)

    Building Block Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. 并查集模板 && 带权并查集模板

    不带权: ]; void init(void) { ;i<=n;i++) f[i]=i; } int fd(int x) { return f[x]==x?x:fd[x]=fd(f[x]); } ...

  5. AcWing:240. 食物链(扩展域并查集 or 带边权并查集)

    动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形. A吃B, B吃C,C吃A. 现有N个动物,以1-N编号. 每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用 ...

  6. 算法竞赛进阶指南0x41并查集

    并查集简介 并查集的两类操作: Get 查询任意一个元素是属于哪一个集合. Merge 把两个集合合并在一起. 基本思想:找到代表元. 注意有两种方法: 使用一个固定的值(查询方便,但是在合并的时候需 ...

  7. 并查集&线段树&树状数组&排序二叉树

    超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11 ...

  8. POJ1703Find them, Catch them[种类并查集]

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42416   Accepted: ...

  9. 数据结构与算法分析 – Disjoint Set(并查集)

    什么是并查集?并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题. 并查集的主要操作1.合并两个不相交集合2.判断两个元素是否属于同一集合 主要操作的解释 ...

随机推荐

  1. Redis 代理服务Twemproxy

    1.twemproxy explore 当我们有大量 Redis 或 Memcached 的时候,通常只能通过客户端的一些数据分配算法(比如一致性哈希),来实现集群存储的特性.虽然Redis 2.6版 ...

  2. 微软职位内部推荐-Senior Dev Lead

    微软近期Open的职位: Bing Index Serve team is hiring! We are one of the core teams in Bing serving more than ...

  3. Configuring My Site in SharePoint 2010

    Configuring the User Profile Service in SharePoint 2010 http://sharepointgeorge.com/2010/configuring ...

  4. GNOME与KDE的战争

    目录1 序言2 GNOME与KDE交替发展% M" O/ h% R( b  f, ~7 W' n9 V, G3 GNOME获得商业公司的支持4 KDE3.5可实现半透明和阴影效果,界面华丽. ...

  5. Eclipse 创建Maven工程

    前言 开发环境 sts-3.7.2.RELEASE 创建步骤 1.开启eclipse,右键new——>other,如下图找到maven project 2.选择maven project,显示创 ...

  6. 【BZOJ】【3295】【CQOI2011】动态逆序对

    树套树 Orz zyf神犇 时光倒流……逆序处理,将删点改为加点,动态维护序列. 由于是动态,要加点,所以用树状数组:同时又需要求序列中求比当前元素大/小的元素个数,所以要用平衡树. 所以方法就是在树 ...

  7. Spring+Mybatis+Maven 整合配置

    <?xml version="1.0" encoding="UTF-8"?> <beans default-autowire="by ...

  8. Leetcode#78 Subsets

    原题地址 有两种方法: 1. 对于序列S,其子集可以对应为一个二进制数,每一位对应集合中的某个数字,0代表不选,1代表选,比如S={1,2,3},则子集合就是3bit的所有二进制数. 所以,照着二进制 ...

  9. CSS属性--过渡(transtion)

    首先介绍一下transition的属性取值: transition-property : 主要设置对象中的参与过渡的属性,包括(border-color,background-color,color) ...

  10. [设计模式] 22 模板方法模式 template

    转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...