UVA1395 Slim Span(kruskal)

题目:Slim Span UVA 1395

题意:给出一副无向有权图,求生成树中最小的苗条度(最大权值减最小权值),如果不能生成树,就输出-1;

思路:将所有的边按权值有小到大排序,然后枚举每一条边,以这条边开始利用Kruskal算法生成树,生成过程中求出权值的最大值,这个最大值减去当前枚举的边的权值就是苗条度,再动态维护一下最小苗条度就可以了。

#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <cstring>
#include <sstream>
#include <cmath>
#define INF 0x3f3f3f3f
#define mod 1000000007;
#define FRE() freopen("in.txt","r",stdin)
using namespace std;
const int maxn = 5005;
struct edge
{
    int st,en;
    int w;
}e[maxn];
int pre[maxn];
int n,m;

bool cmd(edge &a,edge &b)
{
    return a.w < b.w;
}

int _Find(int x)
{
    return x == pre[x] ? x : pre[x] = _Find(pre[x]);
}

int main()
{
    //FRE();
    while(scanf("%d%d",&n,&m) && n+m)
    {
        for(int i = 0; i < m; i++)
        {
            scanf("%d%d%d",&e[i].st,&e[i].en,&e[i].w);
        }
        sort(e, e+m, cmd);
        int ans = INF;
        for(int i = 0; i < m; i++)//从小到大枚举每一条边,之后用求得的最大值减去这条边的权值
        {
            for(int i = 1; i <= n; i++) pre[i] = i;
            int cnt = n,mmax = -1;
            for(int j = i; j < m; j++)
            {
                int x = _Find(e[j].st),y = _Find(e[j].en);
                if(x != y)
                {
                    pre[y] = x;
                    cnt--;
                    mmax = max(mmax, e[j].w);//求出最小生成树中最大的权值
                }
            }
            if(cnt == 1)//因为是树,所以有n-1条边,当是一棵树的时候,就动态维护一下最小值
                ans = min(ans, mmax - e[i].w);
        }
        if(ans == INF)
            printf("-1\n");
        else
            printf("%d\n",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/sykline/p/9737791.html

时间: 2024-10-15 16:25:22

UVA1395 Slim Span(kruskal)的相关文章

UVA1395 Slim Span(kruskal算法)

Slim Span [PDF Link] Given an undirected weighted graph G , you should find one of spanning trees specified as follows. The graph G is an ordered pair (V, E) , where V is a set of vertices {v1, v2,..., vn} and E is a set of undirected edges {e1, e2,.

UVALive-3887 Slim Span (kruskal)

题目大意:定义无向图生成树的最大边与最小边的差为苗条度,找出苗条度最小的生成树的苗条度. 题目分析:先将所有边按权值从小到大排序,在连续区间[L,R]中的边如果能构成一棵生成树,那么这棵树一定有最小的苗条度.枚举所有这样的区间. 代码如下: # include<iostream> # include<cstdio> # include<set> # include<queue> # include<cstring> # include<al

POJ-3522 Slim Span(最小生成树)

Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 8633   Accepted: 4608 Description Given an undirected weighted graph G, you should find one of spanning trees specified as follows. The graph G is an ordered pair (V, E), where V 

UVA 1395 - Slim Span(MST)

UVA 1395 - Slim Span 题目链接 题意:给定一些结点和边,要求出最苗条度最小的生成树,苗条度定义为:生成树中最大权的边减去最小权的边的值 思路:类似建最小生成树的算法,多一步枚举起始边即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 105; const int INF = 0x3f3f3f3f; int

Uva1395 POJ3522 Slim Span (最小生成树)

Description Given an undirected weighted graph G, you should find one of spanning trees specified as follows. The graph G is an ordered pair (V, E), where V is a set of vertices {v1, v2, -, vn} and E is a set of undirected edges {e1, e2, -, em}. Each

1395 - Slim Span (最小生成树)

UVA上的题就是让人眼前一亮,不同于那些赤裸裸的生成树水题,该题稍加了变化,不是求最小生成树,而是求最苗条生成树 . 因为生成树有很多,而且每一棵生成树的最大边与最小边只差也是不确定的 .所以只能枚举所有的生成树 . 套用最小生成树模板 ,我们可以枚举生成树的起点位置,然后向后推终点位置,当n个点全部连通时,那么这棵生成树的边集就是[L,R] .因为边事先都排好序了, 那么该树的苗条值就是e[R] - e[L] . 这样从小到大枚举所有的L ,不断更新答案,就可以了 . 忍不住再说一下并查集,这

UVa 1395 Slim Span (最小生成树)

题意:给定n个结点的图,求最大边的权值减去最小边的权值最小的生成树. 析:这个和最小生成树差不多,从小到大枚举左端点,对于每一个左端点,再枚举右端点,不断更新最小值.挺简单的一个题. #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 100 + 5; const int INF = 0x3f3f3f3f; int p[maxn]

Sicily 1504:Slim Span(最小生成树)

1 #include<bits/stdc++.h> 2 using namespace std; 3 4 struct Vertex{ 5 int start, end; 6 int weight; 7 }; 8 Vertex arr[10000]; 9 int par[10000]; 10 int n, m; 11 int find(int n){ 12 while(par[n] != n){ 13 n = par[n]; 14 } 15 return n; 16 } 17 void mer

UVA1395 Slim Span(枚举最小生成树)

题意: 求最小生成树中,最大的边减去最小的边 最小值. 看了题解发现真简单=_= 将每条边进行从小到大排序,然后从最小到大一次枚举最小生成树,当构成生成树的时候,更新最小值 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int INF = 0x3f3f3f3f; 7 con