题意:

  给你一个图,让你求这个图中所有生成树中满足题目条件的,这个条件是生成树中最长边与最短边的差值最小。

思路:

  根据最小瓶颈生成树的定义:在一个有权值的无向图中,求一个生成树最大边的权值尽量小。首先以K算法做这道题,先给所有边排好序,然后我可以从小到大枚举每一条边作为我所求生成树的最短边(即第一次以最短边求最小生成树,第二次删除第一条边,以第二条边为最短边求最小生成树,第三次删除第一条边和第二条边,以第三边为最短边求最小生成树。)然后在这个过程中更新   MST(maxE- minE)就好了。这么做的原因是:因为最小生成树一定是无向图的瓶颈生成树。即如果最短边(第一条边)已经定下来,那么最小生成树的 (maxE- minE)一定比其他以这个边为最短边的生成树的(maxE - min E)小。所以就可以依次枚举这个最短边,更新答案就好了。

代码:

  1. import java.util.Scanner;
  2. import java.util.Comparator;
  3. import java.util.Arrays;
  4.  
  5. class Node{
  6. public int u, v, w, mark;
  7. }
  8. //结构排序
  9. class mycmp implements Comparator<Node>{
  10. public int compare(Node A, Node B){
  11. return A.w - B.w;
  12. }
  13. }
  14. public class Main {
  15. final static int MAXN = 10000 + 13;
  16. final static int INF = 0x3f3f3f3f;
  17. static int[] pre = new int[MAXN];
  18. static Node[] map = new Node[MAXN];
  19. public static void main(String[] args){
  20. Scanner sc = new Scanner(System.in);
  21. while(true){
  22. int N,M;
  23. N = sc.nextInt();
  24. M = sc.nextInt();
  25. if(N == 0 && M == 0)break;
  26. for(int i = 1; i <= M; i++){
  27. map[i]=new Node();
  28. map[i].u = sc.nextInt();
  29. map[i].v = sc.nextInt();
  30. map[i].w = sc.nextInt();
  31. map[i].mark = 0;
  32. }
  33. met(N);
  34. Arrays.sort(map, 1, M + 1, new mycmp());
  35. int sst = ksu(N, M, 0); //SST 初始化为最小生成树的值
  36. for(int i = 1; i <= M; i++){ //求SST
  37. met(N);
  38. int temp = ksu(N, M, i);//以第 i + 1 条边作为第一条边(即删除前i条边后)求MST,如果不等于 -1 说明构造成功
  39. if(temp < sst && temp != -1){
  40. sst = temp;
  41. }
  42. }
  43. System.out.println(sst);
  44. }
  45. sc.close();
  46. }
  47. public static int ksu(int N, int M,int mark){ //删除 前 mark 条边 求 MST
  48. int cnt= 0;
  49. int st, ed;
  50. st = ed = map[1].w;
  51. boolean flag = true;
  52. for(int i = mark + 1; i <= M; i++){
  53. int fu = Find(map[i].u);
  54. int fv = Find(map[i].v);
  55. if(fu != fv){
  56. if(flag){
  57. st = map[i].w;
  58. flag = false;
  59. }
  60. cnt++;
  61. pre[fv] = fu;
  62. }
  63. if(cnt == N - 1){
  64. ed = map[i].w;
  65. return ed - st;
  66. }
  67. }
  68. return -1;
  69. }
  70. public static int Find(int x){
  71. return x == pre[x] ? x : (pre[x] = Find(pre[x]));
  72. }
  73. public static void debug(int M){
  74. for(int i = 1; i <= M; i++){
  75. System.out.println(i + " " + map[i].u + " " + map[i].v + " " + map [i].w + " "+ map[i].mark);
  76. }
  77. }
  78. public static void met(int N){
  79. for(int i = 1; i <= N; i++){
  80. pre[i] = i;
  81. }
  82. }
  83. }

UVA 1395 Slim Span 最小生成树的更多相关文章

  1. UVA 1395 Slim Span (最小生成树,MST,kruscal)

    题意:给一个图,找一棵生成树,其满足:最大权-最小权=最小.简单图,不一定连通,权值可能全相同. 思路:点数量不大.根据kruscal每次挑选的是最小权值的边,那么苗条度一定也是最小.但是生成树有多棵 ...

  2. UVa 1395 Slim Span (最小生成树)

    题意:给定n个结点的图,求最大边的权值减去最小边的权值最小的生成树. 析:这个和最小生成树差不多,从小到大枚举左端点,对于每一个左端点,再枚举右端点,不断更新最小值.挺简单的一个题. #include ...

  3. UVa 1395 - Slim Span(最小生成树变形)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. UVa 1395 Slim Span【最小生成树】

    题意:给出n个节点的图,求最大边减最小边尽量小的值的生成树 首先将边排序,然后枚举边的区间,判定在该区间内是否n个点连通,如果已经连通了,则构成一颗生成树, 则此时的苗条度是这个区间内最小的(和kru ...

  5. UVA - 1395 Slim Span (最小生成树Kruskal)

    Kruskal+并查集. 点很少,按边权值排序,枚举枚举L和R,并查集检查连通性.一旦连通,那么更新答案. 判断连通可以O(1),之前O(n)判的,第一次写的过了,后来T.. #include< ...

  6. UVa 1395 Slim Span

    问题:给出一个n结点的图,求最大边与最小边差值最小的生成树 my code: #include <iostream> #include <cstdio> #include &l ...

  7. poj 3522 Slim Span (最小生成树kruskal)

    http://poj.org/problem?id=3522 Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions ...

  8. POJ 3522 Slim Span 最小生成树,暴力 难度:0

    kruskal思想,排序后暴力枚举从任意边开始能够组成的最小生成树 #include <cstdio> #include <algorithm> using namespace ...

  9. uva1395 - Slim Span(最小生成树)

    先判断是不是连通图,不是就输出-1. 否则,把边排序,从最小的边开始枚举最小生成树里的最短边,对每个最短边用Kruskal算法找出最大边. 或者也可以不先判断连通图,而是在枚举之后如果ans还是INF ...

随机推荐

  1. 《Cracking the Coding Interview》——第4章:树和图——题目4

    2014-03-19 03:40 题目:给定一棵二叉树,把每一层的节点串成一个链表,最终返回一个链表数组. 解法:前序遍历,遍历的同时向各个链表里添加节点.水平遍历好像还不如前序遍历来得方便. 代码: ...

  2. 【Decision Tree】林轩田机器学习技法

    首先沿着上节课的AdaBoost-Stump的思路,介绍了Decision Tree的路数: AdaBoost和Decision Tree都是对弱分类器的组合: 1)AdaBoost是分类的时候,让所 ...

  3. 【Binary Search Tree Iterator 】cpp

    题目: Implement an iterator over a binary search tree (BST). Your iterator will be initialized with th ...

  4. selenium 使用谷歌浏览器模拟wap测试

    /** * 使用谷歌浏览器模拟手机浏览器 * @param devicesName * @author xxx * 创建时间:2017-06-15,更新时间:2017-06-15 * 备注 */ pu ...

  5. hnust 罚时计算器

    问题 F: 罚时计算器 时间限制: 1 Sec  内存限制: 128 MB提交: 229  解决: 63[提交][状态][讨论版] 题目描述 一般 ACM程序设计比赛都是五个小时.但是比赛结束时,DB ...

  6. JavaWeb笔记(十)非关系型数据库Redis

    Redis Redis是一款高性能的NOSQL系列的非关系型数据库 主流的NOSQL产品 键值(Key-Value)存储数据库 相关产品: Tokyo Cabinet/Tyrant.Redis.Vol ...

  7. Comparable和Comparator的学习笔记

    目录 Comparable和Comparator的实现 Comparable接口 Comparator接口 总结 参考自 今天在项目开发中,遇到要对List中的对象按照对象某一属性进行排序的问题,我发 ...

  8. Java9最受期待的5大新特性

    虽然Java9要等到明年才正式发布,但是现在网上已经有了各种各样的有关Java9新特性的文章了,今天小编也将为大家分享除了通常猜测之外的一些很值得期待的5个新特性. 1.Java + REPL = j ...

  9. A公司 推荐算法大赛 总结

    一.介绍 ♦通过用户前四个月(04.15~08.15)的用户行为预测用户第五个月(08.15~09.15)将会购买的品牌.用户共有四种行为(type)分别是:点击(0).购买(1).购物车(2).收藏 ...

  10. Bsd内核选项总结

    Bsd内核选项总结 一: 下面这个选项在每个内核中都要有: machine i386 它指明了机器的硬件体系结构.它必须是i386, pc98, sparc64, alpha, ia64, amd64 ...