POJ 3522 Slim Span

8人阅读 评论(0) 收藏 举报
分类:

Description

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.

nm 
a1b1w1
  
ambmwm

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

题解:首先对边权升序排序,第一个for循环从小到大枚举MST的最小边权,第二个for循环从小到大枚举MST的最大边权;当所有点联通时存储最大边权-最小边权;

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 110;
const int INF= 1000000000;
int F[maxn];
int n,m;
struct Edge{
 int x,y,w;
}edge[maxn*maxn];
void init()
{
        for (int i = 0;i < n; i++) F[i] = i;
}
int Find(int x)
{
        if(F[x]==x) return x;
        return F[x] = Find(F[x]);
}
bool cmp(Edge p,Edge q) {return p.w < q.w;}
int main()
{
        while(scanf("%d%d",&n, &m) != EOF)
        {
                if(n == 0 && m == 0) break;
                for (int i = 0;i < m;i++)
                {

                        scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].w);
                }
                sort(edge,edge+m,cmp);
                int ans=INF;
                for (int i = 0;i <=m - n + 1 ;i++)
                {
                         init();
                         int cnt=0,temp=-1;
                        for (int j = i;j < m;j++)
                        {
                                int xroot=Find(edge[j].x),yroot =Find(edge[j].y);
                                if(xroot != yroot)
                                {
                                        F[xroot] = yroot;
                                        cnt ++;
                                        if(cnt == n-1)
                                        {
                                                temp = edge[j].w - edge[i].w;
                                                break;
                                        }
                                }

                        }
                        if(temp != -1 && temp < ans) ans=temp;
                }
                if(ans<INF) printf("%d\n",ans);
                else printf("-1\n");
        }
}

查看评论

poj3522Slim Span(最小生成树性质)

题目链接 Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submis...
  • fouzhe
  • fouzhe
  • 2017-02-04 09:54:17
  • 298

POJ 3522 Slim Span (Kruskal +枚举 边权差最小的生成树)

POJ 3522 Slim Span (Kruskal 边权差最小的生成树)
  • Tc_To_Top
  • Tc_To_Top
  • 2015-02-09 23:20:45
  • 1356

POJ3522-Slim Span

求生成树里 |最大权-最小权|==差值,求差值最小的。 反复思索应该用什么算法,但最后答案就是kruskal的枚举。(之前在大连也遇到过这种题,就是需要让你把一个算法枚举)数据量比较小,所以不会超时...
  • hy1405430407
  • hy1405430407
  • 2015-08-10 15:27:35
  • 351

poj 3522 Slim Span

求一棵生成树,使它的最大边与最小边z
  • u011281853
  • u011281853
  • 2014-07-03 20:34:32
  • 381

(POJ - 3522)Slim Span

(POJ - 3522)Slim Span Given an undirected weighted graph G, you should find one of spanning trees sp...
  • wozaipermanent
  • wozaipermanent
  • 2017-08-24 16:09:31
  • 119

poj 3522 Slim Span

点击打开链接poj 3522 思路:kruskal + 枚举生成树 分析:题目要求的是找到一个生成树使得生成树中“最大边-最小边”的值最小。如果这个图有n个点,那么这个生成树有n-1条边。...
  • cgl1079743846
  • cgl1079743846
  • 2012-10-03 23:15:00
  • 735

POJ - 3522 - Slim Span

Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 8717   Accepted: 4642 ...
  • lose__way
  • lose__way
  • 2017-08-21 16:14:41
  • 78

POJ 3522 - Slim Span

在所有生成树里,找到“最大边权值 减去 最小边权值”最小的那棵生成树。 那么,对于已经某个确定的最小边的所有生成树,我们找到最小生成树,它的“最大边权值 减去 最小边权值”就是这些生成树里最小的。 ...
  • Freenm
  • Freenm
  • 2017-04-05 17:32:33
  • 90

POJ 3522 Slim Span

题意: 求最大边与最小边差值最小的生成树 解法: 本人写的时候就是枚举最小边构造最小生成树乱搞出来的,后来去查各种网传版本,也确实是这样,传说依据是Kruskal的神贪心,必取最大边的最小值。 表示压...
  • z286830682
  • z286830682
  • 2013-08-05 21:23:23
  • 508

POJ 3522:Slim Span

Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 8033   Acce...
  • wyxeainn
  • wyxeainn
  • 2017-05-05 09:23:04
  • 148
    个人资料
    持之以恒
    等级:
    访问量: 671
    积分: 462
    排名: 11万+
    文章存档
    最新评论