UVA 1395 Slim Span

来源:互联网 发布:下载查询信鸽软件 编辑:程序博客网 时间:2024/06/06 20:35


题目大意:
       给出一个n(n <= 100 ) 节点的图,求苗条度(最大边 减去 最小边 的值)最小的生成树。
解题思路:
       首先按照权值,把边从小到大排序,然后从小到大枚举起始边,当所有点连通时停止,记录最小的一个苗条度。

#include <iostream>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <cstdio>using namespace std;const int maxn = 100000 + 10;struct Edge{    int u;    int v;    int w;}edge[maxn];int f[maxn];int n,m;bool cmp(Edge a,Edge b){    return a.w < b.w;}int find(int x){    return f[x] == x ? x : f[x] = find(f[x]);}int main(){    while(cin>>n>>m)    {        if(n==0 && m==0)            break;        int u,v,w;        for(int i=1;i<=m;i++)        {            cin>>u>>v>>w;            edge[i].u = u;            edge[i].v = v;            edge[i].w = w;        }        int flag = 0;        int ans = 10000000;        int Max = 0,Min = 10000000;        sort(edge+1,edge+1+m,cmp);        for(int i=1;i<=m;i++)        {            Max = 0;Min = 10000000;            int k = 0;            for(int j=0;j<=n;j++) f[j] = j;            for(int j=i;j<=m;j++)            {                int x = find(edge[j].u);                int y = find(edge[j].v);                if(x != y)                {                    k++;                    f[x] = y;                    if(edge[j].w > Max) Max = edge[j].w;                    if(edge[j].w < Min) Min = edge[j].w;                }            }            if(k==n-1 && Max - Min < ans) { ans = Max - Min;flag = 1;}        }        if(flag)        cout<<ans<<endl;        else        cout<<-1<<endl;    }    return 0;}


0 0
原创粉丝点击