题目传送门

题意:给一张无向图,问存在多少(a, b)表示a点到b点经过的边值小于等于x ((a,b) 和 (b, a)属于不同的方案)

分析:首先将边权值和查询x值升序排序,从前往后扫描边,累加从u和v两个集合各自选取一个组成(a, b)的方案数(u,v属于不同的集合),不能从一个集合选两个,因为同一个集合的方案数已经计算过了。然后将u和v合并到一个集合,在O (m) 复杂度得到答案

收获:并查集真是个很好的数据结构

代码:

  1. /************************************************
  2. * Author :Running_Time
  3. * Created Time :2015/9/13 星期日 17:55:11
  4. * File Name :E.cpp
  5. ************************************************/
  6.  
  7. #include <cstdio>
  8. #include <algorithm>
  9. #include <iostream>
  10. #include <sstream>
  11. #include <cstring>
  12. #include <cmath>
  13. #include <string>
  14. #include <vector>
  15. #include <queue>
  16. #include <deque>
  17. #include <stack>
  18. #include <list>
  19. #include <map>
  20. #include <set>
  21. #include <bitset>
  22. #include <cstdlib>
  23. #include <ctime>
  24. using namespace std;
  25.  
  26. #define lson l, mid, rt << 1
  27. #define rson mid + 1, r, rt << 1 | 1
  28. typedef long long ll;
  29. const int N = 2e4 + 10;
  30. const int M = 1e5 + 10;
  31. const int Q = 5e3 + 10;
  32. const int INF = 0x3f3f3f3f;
  33. const int MOD = 1e9 + 7;
  34. struct UF {
  35. int rt[N], rk[N];
  36. void init(void) {
  37. memset (rt, -1, sizeof (rt));
  38. memset (rk, 0, sizeof (rk));
  39. }
  40. int Find(int x) {
  41. return rt[x] == -1 ? x : rt[x] = Find (rt[x]);
  42. }
  43. void Union(int x, int y) {
  44. x = Find (x), y = Find (y);
  45. if (x == y) return ;
  46. if (rk[x] > rk[y]) {
  47. rt[y] = x; rk[x] += rk[y] + 1;
  48. }
  49. else {
  50. rt[x] = y; rk[y] += rk[x] + 1;
  51. }
  52. }
  53. bool same(int x, int y) {
  54. return Find (x) == Find (y);
  55. }
  56. }uf;
  57. struct Edge {
  58. int u, v, w;
  59. bool operator < (const Edge &r) const {
  60. return w < r.w;
  61. }
  62. }edge[M];
  63. struct Query {
  64. int x, id;
  65. bool operator < (const Query &r) const {
  66. return x < r.x;
  67. }
  68. }q[Q];
  69. ll ans[Q];
  70.  
  71. int main(void) {
  72. int T; scanf ("%d", &T);
  73. while (T--) {
  74. int n, m, k;
  75. scanf ("%d%d%d", &n, &m, &k);
  76. for (int i=1; i<=m; ++i) {
  77. scanf ("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w);
  78. }
  79. sort (edge+1, edge+1+m);
  80. for (int i=1; i<=k; ++i) {
  81. scanf ("%d", &q[i].x); q[i].id = i;
  82. }
  83. sort (q+1, q+1+k);
  84.  
  85. memset (ans, 0, sizeof (ans));
  86. uf.init (); int j = 1; ll sum = 0;
  87. for (int i=1; i<=k; ++i) {
  88. while (j <= m && q[i].x >= edge[j].w) {
  89. int u = edge[j].u, v = edge[j].v;
  90. if (uf.same (u, v)) {
  91. ++j; continue;
  92. }
  93. u = uf.Find (u), v = uf.Find (v);
  94. sum += (uf.rk[u] + 1) * 1ll * (uf.rk[v] + 1);
  95. uf.Union (u, v); ++j;
  96. }
  97. ans[q[i].id] = sum;
  98. }
  99. for (int i=1; i<=k; ++i) {
  100. printf ("%I64d\n", ans[i] * 2);
  101. }
  102. }
  103.  
  104. return 0;
  105. }

  

并查集 HDOJ 5441 Travel的更多相关文章

  1. 并查集 HDOJ 1232 畅通工程

    题目传送门 /* 并查集(Union-Find)裸题 并查集三个函数:初始化Init,寻找根节点Find,连通Union 考察:连通边数问题 */ #include <cstdio> #i ...

  2. hdu 5441 Travel 离线带权并查集

    Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 De ...

  3. hdu 5441 travel 离线+带权并查集

    Time Limit: 1500/1000 MS (Java/Others)  Memory Limit: 131072/131072 K (Java/Others) Problem Descript ...

  4. Travel(HDU 5441 2015长春区域赛 带权并查集)

    Travel Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Su ...

  5. HDU 5441 Travel(并查集+统计节点个数)

    http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给出一个图,每条边有一个距离,现在有多个询问,每个询问有一个距离值d,对于每一个询问,计算出有多少点 ...

  6. HDU 5441——Travel——————【并查集+二分查界限】

    Travel Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Su ...

  7. HDU 5441 Travel (并查集+数学+计数)

    题意:给你一个带权的无向图,然后q(q≤5000)次询问,问有多少对城市(城市对(u,v)与(v,u)算不同的城市对,而且u≠v)之间的边的长度不超过d(如果城市u到城市v途经城市w, 那么需要城市u ...

  8. (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )

    http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others)    Memo ...

  9. 【BZOJ-1576】安全路径Travel Dijkstra + 并查集

    1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1044  Solved: 363[Sub ...

随机推荐

  1. 继承LinearLayout实现根据屏幕宽度及内部子View个数自动排布GridView

    public class VerticalSearchGridView extends LinearLayout implements View.OnClickListener { private i ...

  2. sql insert and update

    1 二者的区别 insert是插入一条新的数据,它会创建一条新的记录:update是更新一条已经有的数据,它不会创建新的记录. update需要where来指示更新那条记录,否则会更新所有的记录. 2

  3. pyspark 连 MongoDB复制集

    解决问题思路: 核心:0-理解pyspark的执行与java jar的关系: 1-看控制台,看日志: 2-jar缺不缺,版本号,放哪里. [root@hadoop1 mylocalRepository ...

  4. SAP图标- ICON

  5. 用WaveX实现音频文件的录音

    原文地址:https://blog.csdn.net/gongluck93/article/details/53096013 1.WaveInOpen waveInOpen MMRESULT wave ...

  6. SpringBoot配置文件详解

    自定义属性与加载 com.dongk.selfproperty.title=wangdkcom.dongk.selfproperty.name=10000 然后通过@Value("${属性名 ...

  7. POJ1094 Sorting It All Out —— 拓扑排序

    题目链接:http://poj.org/problem?id=1094 Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Tot ...

  8. 简单的JDBC编程步骤

    1.加载数据库驱动(com.mysql.jdbc.Driver) 2.创建并获取数据库链接(Connection) 3.创建jdbc statement对象(PreparedStatement) 4. ...

  9. 非常精彩的Silverlight 2控件样式

    概述 大家是否觉的现在Silverlight 2提供的默认的控件不能满足自己的要求?好在Silverlight的控件可以运用皮肤,微软Silverlight控件的设计者的主管Corrina开发了几套非 ...

  10. ubuntu 源、codename 与 sources.list 文件

    查看 codename $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubunt ...