一道另类生成树

原题链接

将输入的树的\(n-1\)条边按从小到大排序,然后\(Kruskal\)在生成该树的过程中计算新增边的总长。

当在连第\(i\)条边,设该边的两端点为\(x,y\),长度为\(z\),分别属于\(S_x\)和\(S_y\)两个并查集中。

而为了将树变成完全图,显然要将\(S_x,S_y\)两个并查集中所有点一一连边,所以除去原有的这条边,剩下共\(|S_x|\times|S_y|-1\)条边需要被添加。

而为了使完全图的最小生成树是原有树,所以在添加这\(|S_x|\times|S_y|-1\)条边时,必须使得这些边比原有边要长,同时由于要使得添加的边长和最小,所以这些边的长度均为\(z+1\)。

所以总长为\((z+1)\times(|S_x|\times|S_y|-1)\),将其累加至答案即可。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int N = 6010;
  5. struct dd {
  6. int x, y, z;
  7. };
  8. dd a[N];
  9. int fa[N], S[N];
  10. int re()
  11. {
  12. int x = 0;
  13. char c = getchar();
  14. bool p = 0;
  15. for (; c<'0' || c>'9'; c = getchar())
  16. p |= c == '-';
  17. for (; c >= '0'&&c <= '9'; c = getchar())
  18. x = x * 10 + (c - '0');
  19. return p ? -x : x;
  20. }
  21. int fin(int x)
  22. {
  23. if (fa[x] == x)
  24. return x;
  25. return fa[x] = fin(fa[x]);
  26. }
  27. int comp(dd x, dd y)
  28. {
  29. return x.z < y.z;
  30. }
  31. int main()
  32. {
  33. int i, x, y, n, t;
  34. long long s;
  35. t = re();
  36. while (t--)
  37. {
  38. n = re();
  39. for (S[n] = i = 1, fa[n] = n; i < n; i++)
  40. {
  41. a[i].x = re();
  42. a[i].y = re();
  43. a[i].z = re();
  44. fa[i] = i;
  45. S[i] = 1;
  46. }
  47. sort(a + 1, a + n, comp);
  48. for (i = 1, s = 0; i < n; i++)
  49. {
  50. x = fin(a[i].x);
  51. y = fin(a[i].y);
  52. if (x != y)
  53. {
  54. s += 1LL * (a[i].z + 1)*(S[x] * S[y] - 1);
  55. fa[x] = y;
  56. S[y] += S[x];
  57. }
  58. }
  59. printf("%lld\n", s);
  60. }
  61. return 0;
  62. }

JoyOI1391 走廊泼水节的更多相关文章

  1. CH6201 走廊泼水节【最小生成树】

    6201 走廊泼水节 0x60「图论」例题 描述 [简化版题意]给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树.求增加的边的权值总和最小是多少. 我 ...

  2. [Tvvj1391]走廊泼水节(最小生成树)

    [Tvvj1391]走廊泼水节 Description 给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树.求增加的边的权值总和最小是多少. 完全图:完 ...

  3. 「CH6201」走廊泼水节

    「CH6201」走廊泼水节 传送门 考虑 \(\text{Kruskal}\) 的过程以及用到一个最小生成树的性质即可. 在联通两个联通块时,我们肯定会选择最小的一条边来连接这两个联通块,那么这两个联 ...

  4. P1391 走廊泼水节

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景  话说,中中带领的OIER们打算举行一次冬季泼水节,当然这是要秘密进行的,绝对不可以让中中知道.不过中中可是老 ...

  5. 奇葩最小生成树--->走廊泼水节(tyvj1391)

    题目描述 话说,中中带领的OIER们打算举行一次冬季泼水节,当然这是要秘密进行的,绝对不可以让中中知道.不过中中可是老江湖了,当然很快就发现了我们的小阴谋,于是他准备好水枪迫不及待的想要加入我们了. ...

  6. CH 6021 走廊泼水节

    描述 [简化版题意]给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树.求增加的边的权值总和最小是多少. 我们一共有N个OIER打算参加这个泼水节,同时 ...

  7. [TYVJ1391]走廊泼水节

    Description 话说,中中带领的OIER们打算举行一次冬季泼水节,当然这是要秘密进行的,绝对不可以让中中知道.不过中中可是老江湖了,当然很快就发现了我们的小阴谋,于是他准备好水枪迫不及待的想要 ...

  8. CH6201 走廊泼水节[最小生成树]

    描述 [简化版题意]给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树.求增加的边的权值总和最小是多少. 我们一共有N个OIER打算参加这个泼水节,同时 ...

  9. CH 6201 走廊泼水节题解

    题目链接:CH6201 当时在海亮考试的第一题: 心得:其实一个算法是要真正理解这个思路和过程,而并不是单单知道它是用来写什么题的: 思路:n个节点有n-1条边,把这n-1条边按照权值从小到大排序,有 ...

随机推荐

  1. 安装opencv3.x卡在ICV: Downloading ippicv_linux_20151201.tgz...

    参考:http://blog.csdn.net/bobsweetie/article/details/52502741 可以自己下载: ICV: Downloading ippicv_linux_20 ...

  2. eclipse老运行上一个程序之原因总结

    运行eclipse有的时候不运行刚写的类,老是运行别的以前的类,删除了以前的类就啥都不运行.找了好久的原因,最后发现,刚写的类没有main()或者有误.这和java的特点有关,程序的运行总是main( ...

  3. zxing全屏识别(v2.5.0崩溃问题记录)

    自己遇到的问题:/** * Like {@link #getFramingRect} but coordinates are in terms of the preview frame, * not ...

  4. Java7/8 HashMap ConcurrentHashMap

    网上关于 HashMap 和 ConcurrentHashMap 的文章确实不少,不过缺斤少两的文章比较多,所以才想自己也写一篇,把细节说清楚说透,尤其像 Java8 中的 ConcurrentHas ...

  5. jps,jstack

    当java程序发生死循环的时候可以结合使用这两个命令查看死循环发生的位置.

  6. PO ITEM_BOM_工艺路线SQL

    ---物料主数据接口 SELECT count(*)PO_MARA FROM STG.PO_MARA; SELECT count(*)PO_MARC FROM STG.PO_MARC; SELECT ...

  7. javascript学习笔记(八):浏览器对象

    window对象 <!DOCTYPE html> <html> <head lang="en"> <meta chaset="U ...

  8. js增减日期

    参考 https://www.cnblogs.com/gmq-sh/p/5194706.html date.setDate(date.getDate() + 3);

  9. docker save 批量导出脚本

    [root@vultr home]# cat docker_sove.sh docker images > images.txtawk '{print $1}' images.txt > ...

  10. Android使用VideoView播放本地视频及网络视频Demo

    1.xm文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...