Given an undirected weighted graph G, you should find one of spanning trees specified as follows.

The graph G is an ordered pair (VE), where V is a set of vertices {v1v2, …, vn} and E is a set of undirected edges {e1e2, …, em}. Each edge e ∈ E has its weight w(e).

A spanning tree T is a tree (a connected subgraph without cycles) which connects all the n vertices with n − 1 edges. The slimness of a spanning tree T is defined as the difference between the largest weight and the smallest weight among the n − 1 edges of T.

 
Figure 5: A graph G and the weights of the edges

For example, a graph G in Figure 5(a) has four vertices {v1v2v3v4} and five undirected edges {e1e2e3e4e5}. The weights of the edges are w(e1) = 3, w(e2) = 5, w(e3) = 6, w(e4) = 6, w(e5) = 7 as shown in Figure 5(b).

 
Figure 6: Examples of the spanning trees of G

There are several spanning trees for G. Four of them are depicted in Figure 6(a)~(d). The spanning tree Ta in Figure 6(a) has three edges whose weights are 3, 6 and 7. The largest weight is 7 and the smallest weight is 3 so that the slimness of the tree Ta is 4. The slimnesses of spanning trees TbTc and Td shown in Figure 6(b), (c) and (d) are 3, 2 and 1, respectively. You can easily see the slimness of any other spanning tree is greater than or equal to 1, thus the spanning tree Td in Figure 6(d) is one of the slimmest spanning trees whose slimness is 1.

Your job is to write a program that computes the smallest slimness.

Input

The input consists of multiple datasets, followed by a line containing two zeros separated by a space. Each dataset has the following format.

n m  
a1 b1 w1
   
am bm wm

Every input item in a dataset is a non-negative integer. Items in a line are separated by a space. n is the number of the vertices and m the number of the edges. You can assume 2 ≤ n ≤ 100 and 0 ≤ m ≤ n(n − 1)/2. ak and bk (k = 1, …, m) are positive integers less than or equal to n, which represent the two vertices vak and vbk connected by the kth edge ekwk is a positive integer less than or equal to 10000, which indicates the weight of ek. You can assume that the graph G = (VE) is simple, that is, there are no self-loops (that connect the same vertex) nor parallel edges (that are two or more edges whose both ends are the same two vertices).

Output

For each dataset, if the graph has spanning trees, the smallest slimness among them should be printed. Otherwise, −1 should be printed. An output should not contain extra characters.

Sample Input

4 5
1 2 3
1 3 5
1 4 6
2 4 6
3 4 7
4 6
1 2 10
1 3 100
1 4 90
2 3 20
2 4 80
3 4 40
2 1
1 2 1
3 0
3 1
1 2 1
3 3
1 2 2
2 3 5
1 3 6
5 10
1 2 110
1 3 120
1 4 130
1 5 120
2 3 110
2 4 120
2 5 130
3 4 120
3 5 110
4 5 120
5 10
1 2 9384
1 3 887
1 4 2778
1 5 6916
2 3 7794
2 4 8336
2 5 5387
3 4 493
3 5 6650
4 5 1422
5 8
1 2 1
2 3 100
3 4 100
4 5 100
1 5 50
2 5 50
3 5 50
4 1 150
0 0

Sample Output

1
20
0
-1
-1
1
0
1686
50题意:  给出一个n个结点的无向图,找一棵苗条度(最大边减去最小边)最小的生成树。图中不含重边和自环。题解:    首先对边的权值大小排序,从小到大开始枚举最小生成树。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=105,INF=1e9;
int n,m;
int par[maxn];
struct edge
{int u,v,cost;
}es[maxn*maxn];
bool cmp(const edge& a,const edge& b)
{return a.cost<b.cost;
}
int find(int x)
{return x==par[x]?x:par[x]=find(par[x]);
}
void init()
{for(int i=1;i<=n;i++)par[i]=i;
}
void unite(int x,int y)
{x=find(x);y=find(y);if(x!=y)par[x]=y;
}
bool same(int x,int y)
{return find(x)==find(y);
}
int kruskal(int a)
{int cnt=0,Max;init();for(int i=a;i<m;i++){edge e=es[i];if(!same(e.u,e.v)){cnt++;unite(e.u,e.v);if(cnt==n-1)Max=e.cost;}}if(cnt==n-1)return Max-es[a].cost;return INF;
}
int main()
{while(cin>>n>>m,n||m){for(int i=0;i<m;i++)scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].cost);if(m<n-1){cout<<"-1"<<endl;continue;}sort(es,es+m,cmp);int ans=INF;for(int i=0;i<=m-n+1;i++)ans=min(ans,kruskal(i));if(ans==INF)cout<<"-1"<<endl;elsecout<<ans<<endl;}return 0;
}

 

转载于:https://www.cnblogs.com/orion7/p/7395951.html

UVA 1359 POJ 3522 Slim Span(最小生成树kruskal)相关推荐

  1. POJ 3522 Slim Span (Kruskal枚举最小边)

    题意: 求出最小生成树中最大边与最小边差距的最小值. 分析: 排序,枚举最小边, 用最小边构造最小生成树, 没法构造了就退出 1 #include <stdio.h> 2 #include ...

  2. poj 3522 Slim Span

    题意:给N个点,M条边,每个边有相应的权值,然后求出用M条边中的N-1条边形成的树中,边权值最大与最小的差为所有树中最小. 思路:想到了并查集,然后借用克鲁斯卡尔的思想,边排序,再枚举一下即可. 卡了 ...

  3. Slim Span UVA - 1395 (并查集)

    Slim Span UVA - 1395 题目大意: 给出m条边,问使n个节点连成一幅连通图的最大边减去最小边的最小值 思路: 对边按照边权排序,求出在边权从小到大的边序列中连续的可以使点连成图的边的 ...

  4. 洛谷 UVA1395 苗条的生成树 Slim Span

    题目链接 题目描述 求所有生成树中最大边权与最小边权差最小的,输出它们的差值. 题目分析 要求所有生成树中边权极差最小值,起初令人无从下手.但既然要求所有生成树中边权极差最小值,我们自然需要对每一棵生 ...

  5. hdu 1863(最小生成树kruskal)

    /*Name: hdu1863畅通工程 Author: Try86Date: 10/04/12 12:43Description: 最小生成树(kruskal) */ #include <cst ...

  6. POJ 2421 Constructing Roads MST kruskal

    最近刚学的并查集所以用kruskal来试试最小生成树~ kruskal其实用几句话就能说完~  1.贪心所有边的权值,从小到大取值 2.取值时~将边权非0的两个顶点~进行并查操作~如果两个点的祖先不同 ...

  7. HDOJ 1863畅通工程(最小生成树kruskal算法并查集实现)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1863 最小生成树kruskal算法:http://www.zhuoda.org/irini/78592.h ...

  8. hdu 1162(最小生成树kruskal)

    /*Name: 最小生成树(kruskal) Author: Date: 10/04/12 19:17 */#include <math.h> #include <cstdio> ...

  9. 图的最小生成树-Kruskal算法

    问题引入 [问题描述] 编写程序,利用带权无向图的邻接矩阵存储,实现图的最小生成树Kruskal算法. [输入形式] 输入图的顶点序列及图的边的情况.如样例所示.边的输入以输入-1,-1,-1作为结束 ...

  10. 【老生谈算法】matlab实现Kruskal避圈算法求最小生成树——Kruskal避圈算法

    基于MATLAB的Kruskal避圈算法求最小生成树 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]基于MATLAB的Kruskal避 ...

最新文章

  1. 深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索
  2. 【数据库】适用于SQLite的SQL语句(二)
  3. java   web servelt
  4. LNMP安装目录及配置文件位置
  5. Javascript中call的使用
  6. UIControl事件
  7. Membership 数据字典
  8. FPN论文解读(附网络结构层次代码)
  9. linux换w7就蓝屏,联想天逸510s改装win7后蓝屏的解决方案
  10. 4k电视测试软件64,2017年四款看4k视频软件推荐,智能电视必备!
  11. MySQL for Excel的安装教程
  12. Linux嵌入式和单片机嵌入式到底什么区别?
  13. 坚持#第303天~补起昨天的、顺便写今天的(昨天又在公司搞zabbix搞到了凌晨1点,结果搞忘了写博客),主要是zabbix监控
  14. 【高数】变上限积分的等价无穷小替换
  15. 惠普关闭 secure boot
  16. win10下git命令窗口快速命令
  17. 网络安全工程师从0单排日记-0
  18. 关于电容、电阻并联接地
  19. PRD文档和交互文档(DRD)有什么区别
  20. SDNU-多校训练赛2-[ABF]

热门文章

  1. gnome 3 初见
  2. 北京计算机暑期培训,北京暑期计算机培训心得体会.doc
  3. Preferences DataStore------JAVA
  4. Linux PCI总线驱动-1
  5. BLE技术知识点大全
  6. thinkpad选择启动项_ThinkPad如何设置光驱引导启动
  7. 数据文件offline online
  8. 设置电脑的背景颜色为保护色
  9. docker image 重命名
  10. idea下载postgresql的驱动失败Failed to download ,报connect timed out的解决方法