【问题描述】

约翰农场的牛群希望能够在 N 个(1<=N<=200)草地之间任意移动。草地的编号由 1到N。草地之间有树林隔开。牛群希望能够选择草地间的路径,使牛群能够从任一 片草地移动到任一片其它草地。 牛群可在路径上双向通行。

牛群并不能创造路径,但是他们会保有及利用已经发现的野兽所走出来的路径(以 下简称兽径)。每星期他们会选择并管理一些或全部已知的兽径当作通路。

牛群每星期初会发现一条新的兽径。他们接着必须决定管理哪些兽径来组成该周牛 群移动的通路,使得牛群得以从任一草地移动到任一草地。牛群只能使用当周有被 管理的兽径做为通路。

牛群希望他们管理的兽径长度和为最小。牛群可以从所有他们知道的所有兽径中挑 选出一些来管理。牛群可以挑选的兽径与它之前是否曾被管理无关。

兽径决不会是直线,因此连接两片草地之间的不同兽径长度可以不同。 此外虽然 两条兽径或许会相交,但牛群非常的专注,除非交点是在草地内,否则不会在交点 换到另外一条兽径上。

在每周开始的时候,牛群会描述他们新发现的兽径。如果可能的话,请找出可从任 何一草地通达另一草地的一组需管理的兽径,使其兽径长度和最小。

【输入文件】

输入的第一行包含两个用空白分开的整数 N 和 W。W 代表你的程序需要处理 的周数. (1 <= W <= 6000)。

以下每处理一周,读入一行数据,代表该周新发现的兽径,由三个以空白分开 的整数分别代表该兽径的两个端点 (两片草地的编号) 与该兽径的长度(1…10000)。一条兽径的两个端点一定不同。

【输出文件】

每次读入新发现的兽径后,你的程序必须立刻输出一组兽径的长度和,此组兽径可从任何一草地通达另一草地,并使兽径长度和最小。如果不能找到一组可从任一草地通达另一草地的兽径,则输出 “-1”。

【样例】

輸入

輸出

說明

4 6

1 2 10

-1

No trail connects 4 to the rest of the fields.

1 3 8

-1

No trail connects 4 to the rest of the fields.

3 2 3

-1

No trail connects 4 to the rest of the fields.

1 4 3

14

Maintain 1 4 3, 1 3 8, and 3 2 3.

1 3 6

12

Maintain 1 4 3, 1 3 6, and 3 2 3.

2 1 2

8

Maintain 1 4 3, 2 1 2, and 3 2 3.

program exit

【题解】

题目说的什么到达其他草坪。翻译就是要求最小生成树。然后每周都增加一条路径。

1.是否联通。->用并查集。每遇到一个r1!=r2则接一条线。接了n-1条线。则整张图都联通了。否则输出-1即可。

2.最小生成树?用kruskal算法。因为是一条边一条边地插入。所以可以用选择排序。注意这种一个一个元素地插入到一个有序序列中每次操作的时间复杂度都为O(n).因为你最坏情况只要扫描一遍就可以了。然后扫描W次。总的复杂度为O(W^2)。

然后按照克鲁斯卡尔算法的方法一条边一条边地递增答案就好。

【代码】

  1. #include <cstdio>
  2.  
  3. struct bian
  4. {
  5. int x, y, z;
  6. };
  7.  
  8. int n, w,f[201],tot_bian =1,totm = 0,fa[201];
  9. bian a[6001];
  10.  
  11. int findfather2(int x) //这个寻找根节点的int用于克鲁斯卡尔算法
  12. {
  13. if (fa[x] == x)
  14. return x;
  15. if (fa[x] != x)
  16. fa[x] = findfather2(fa[x]);//路径压缩
  17. return fa[x];
  18. }
  19.  
  20. int findfather(int x)//这个寻找根节点的函数用于判断图是否联通
  21. {
  22. if (f[x] == x)
  23. return x;
  24. if (f[x] != x)
  25. f[x] = findfather(f[x]);
  26. return f[x];
  27. }
  28.  
  29. int main()
  30. {
  31. scanf("%d%d", &n, &w);
  32. for (int i = 1; i <= n; i++)
  33. f[i] = i;
  34. a[1].z = -210000000;//在序列的开始添加一个很小的数字。(实则没用)
  35. for (int i = 1; i <= w; i++)
  36. {
  37. int x, y, z;
  38. scanf("%d%d%d", &x, &y, &z);
  39. int key = tot_bian + 1;//从tot_bian+1的位置开始扫描
  40. while (a[key - 1].z > z)//一直往前扫描直到a[key-1]<=a[key]
  41. key--;//a数组是从小到大排序的。
  42. for (int j = tot_bian + 1; j >= key + 1; j--)//把key和key后面的数字往后移动
  43. a[j] = a[j - 1];
  44. a[key].x = x;a[key].y = y;a[key].z = z;//把新输入的边放在key的位置。
  45. tot_bian++;//边数递增
  46. int r1 = findfather(x), r2 = findfather(y);
  47. if (r1 != r2)//如果能够添加有效边
  48. {//有效边的含义是能够递增联通的点的数目的边
  49. totm++;//边的数目递增
  50. f[r1] = r2;
  51. }
  52. if (totm < n - 1)//如果添加的有效边的数目小于n-1则还没有联通
  53. printf("-1\n");
  54. else //如果已经联通了
  55. {
  56. int now = 0,ans= 0;
  57. for (int j = 1; j <= n; j++)//初始化克鲁斯卡尔算法的并查集
  58. fa[j] = j;
  59. for (int j = 2; j <= tot_bian; j++)//第一个元素是那个-210000000
  60. {
  61. int r1 = findfather2(a[j].x), r2 = findfather2(a[j].y);
  62. if (r1 != r2)//从小到大选边即可。
  63. {
  64. now++;
  65. ans += a[j].z;
  66. fa[r1] = r2;
  67. if (now == n - 1)
  68. break;
  69. }
  70. }
  71. printf("%d\n", ans);
  72. }
  73. }
  74. return 0;
  75. }

【u015】兽径管理的更多相关文章

  1. 2021.08.05 P1340 兽径管理(最小生成树)

    2021.08.05 P1340 兽径管理(最小生成树) P1340 兽径管理 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.离线化. 题意: 有n个点,m条边,每次加 ...

  2. luogu P1340 兽径管理

    题目描述 约翰农场的牛群希望能够在 N 个(1<=N<=200) 草地之间任意移动.草地的编号由 1到 N.草地之间有树林隔开.牛群希望能够选择草地间的路径,使牛群能够从任一 片草地移动到 ...

  3. 洛谷 P1340 兽径管理

    题目描述 约翰农场的牛群希望能够在 N 个(1<=N<=200) 草地之间任意移动.草地的编号由 1到 N.草地之间有树林隔开.牛群希望能够选择草地间的路径,使牛群能够从任一 片草地移动到 ...

  4. P1340 兽径管理 洛谷

    https://www.luogu.org/problem/show?pid=1340 题目描述 约翰农场的牛群希望能够在 N 个(1<=N<=200) 草地之间任意移动.草地的编号由 1 ...

  5. 【洛谷1340】兽径管理(最小生成树 Kruskal)(sort的一些技巧)【2012福建省信息学奥林匹克CCF NOIP夏令营第05天训练】

    Description 约翰农场的牛群希望能够在 N 个(1<=N<=6000) 草地之间任意移动.草地的编号由 1到 N.草地之间有树林隔开.牛群希望能够选择草地间的路径,使牛群能够从任 ...

  6. P1340 兽径管理

    传送门 思路: 题目要求每次连边都要输出最小生成树的边权和.如果在线直接套用最小生成树模板肯定会超时,考虑离线处理.记录每一插入边的时间,在所有边都插入完成后排序一遍就可以求最小生成树(按照插入时间的 ...

  7. [Luogu] 兽径管理

    题面:https://www.luogu.org/problemnew/show/P1340 题解:https://www.zybuluo.com/wsndy-xx/note/1153773

  8. [总结]最小生成树之Kruskal算法

    目录 一.最小生成树的相关知识 1. 树的性质 2. 生成树 3. 最小生成树 4. 最小生成树的性质 二.Kruskal算法求最小生成树 1. 核心思想 2. 具体流程 3. 图示 4. 代码实施 ...

  9. zoj 3652 Maze

    Maze Time Limit: 2 Seconds      Memory Limit: 65536 KB Celica is a brave person and believer of a Go ...

随机推荐

  1. 自绘listCtrl控件选中该行高亮(模拟windows)

    CListCtrl的派生类CMyListCtrl的DrawItem()函数里添加代码 CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC); if ...

  2. C# winform利用反射和自定义特性加载功能模块(插件式开发)

    由于在实际的工作中, 碰见这样的一个问题: 一个软件, 销售给A客户 他需要所有功能, 但是销售给B客户, 他只需要其中的一部分, 1.如果我们在实际的开发过程中, 没有把一些功能模块区分开来的话, ...

  3. silverlight依据json字符串动态创建实体类

    1.接收json字符串: //用JsonValue转换json字符串是为了之后获得json字符串的每行数据和每一列的列名 JsonValue jv = JsonValue.Parse(json);   ...

  4. HDU1203 I NEED A OFFER! 【贪心】

    I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. (转)bat批处理的注释语句

    在批处理中,段注释有一种比较常用的方法: goto start = 可以是多行文本,可以是命令 = 可以包含重定向符号和其他特殊字符 = 只要不包含 :start 这一行,就都是注释 :start 另 ...

  6. Day1:字符编码

    一.ASCII码 ASCII(American Standard Code for Information Interchange,美国标准信息交换代码),8位,一个字节,最多只能表示255个符号. ...

  7. UVA 11090 Going in Cycle!!(Bellman-Ford推断负圈)

    题意:给定一个n个点m条边的加权有向图,求平均权值最小的回路. 思路:使用二分法求解.对于每个枚举值mid,推断每条边权值减去mid后有无负圈就可以. #include<cstdio> # ...

  8. 读<阿里亿级日活网关通道架构演进>有感

    读<阿里亿级日活网关通道架构演进>时对优化方法有些概念不理解,特意搜索了一下,拓展自己的思路. 其中的优化: 优化方法中1,2比较常见,3,4我知道的比较少,很感兴趣.就继续追踪下去: 于 ...

  9. 8.5 Android灯光系统_源码分析_通知灯

    参考文章(应用程序举例)how to use the LED with Android phonehttp://androidblogger.blogspot.jp/2009/09/tutorial- ...

  10. mongodb查询部分满足条件的列

    db.tblorders.createIndex( { orderid : -1 },{background:true, name:"index_orderid"} ); db.o ...