UVA 1395 Slim Span

题意:

  要求的是所有生成树中最大边与最小边差值最小的那个。

分析:

  其实可以利用最小瓶颈生成树,就是最小生成树这一性质,枚举原图的最小边,然后找相应生成树的最大边

代码:

 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=110;
const int INF=10000000000;
struct edge
{
    int x,y;
    int d;
    bool operator <(const edge &a)const
    {
        return d<a.d;
    }
}e[maxn*maxn];
int fa[maxn];
int n,m;
int maxt;
int find(int x)
{
    return fa[x]==x?x:fa[x]=find(fa[x]);
}
int kruskal(int x)
{
    maxt=-1;
    int cnt=0;
    int i;
    for(i=0;i<=n;i++)
        fa[i]=i;
    for(i=x;i<m;i++)
    {
        int pa=e[i].x;
        int pb=e[i].y;
        int d=e[i].d;
        int X=find(pa);
        int Y=find(pb);
        if(X!=Y)
        {
            fa[X]=Y;
            maxt=max(d,maxt);
            if(++cnt==n-1)
                return 1;
        }
    }
    return 0;
}
int main()
{
    while(scanf("%d%d",&n,&m))
    {
        if(n==0&&m==0)
            break;
        int i;
        for(i=0;i<m;i++)
            scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].d);
        sort(e,e+m);
        int ans=INF;
        for(i=0;i<m;i++)
        {
            if(kruskal(i)==1)
            {
                ans=min(ans,maxt-e[i].d);
            }
        }
        if(ans==INF)
            printf("-1\n");
        else
            printf("%d\n",ans);
    }
}

  

posted @ 2015-10-24 20:05  幻世沉溺  阅读(111)  评论(0编辑  收藏  举报