最平衡生成树

题目描述
学习完最小生成树后,老师只给出几道模板题,为了尽快提升自己的编程能力,小C同学给自己出了这样一道题:最平衡生成树。
最平衡生成树是这样定义的,一个有 n 个结点的连通图的生成树包含原图中的所有n个结点,并且最长边与最短边的差值最小。
现在给你一个有n个结点的图,求最平衡生成树中最长边与最短边的差值。
 
输入
输入第一行为n和m两个正整数,分别表示图的结点数和边数。
以下m行每行包含三个数a,b,w,分别表示每条边的两个端点和边的权值。
 
输出
输出满足题目要求的最小值,如果找不到最平衡生成树,则输出-1。
 
样例输入
4 5
1 2 3
1 3 5
1 4 6
2 4 6
3 4 7


样例输出
1




【数据范围】
对于100%的数据,2<=n<=100,0<=m<=n(n-1)/2,w<=10000。 
【样例输入2】 
3 0 
【样例输出2】 
-1 







先sort排序后挨个枚举,每次选n-1条边构成最小生成树,用一个变量记录最优值,最后输出即可。

#include<bits/stdc++.h>
#define N 105
using namespace std;
 
int d[N],n,m,ans=-1;
struct lhy
{
    int x,y,w;
}c[N*(N-1)/2];
int find(int t)
{
    while(t!=d[t]) t=d[t]=d[d[t]];
    return t;
}
bool cmp(lhy a,lhy b)
{
    return a.w<b.w;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&c[i].x,&c[i].y,&c[i].w);
    }
    sort(c+1,c+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++) d[j]=j;
        int cnt=0;
        for(int j=i;j<=m;j++)
        {
            int a=find(c[j].x),b=find(c[j].y);
            if(a==b) continue;
            d[a]=b;
            cnt++;
            if(cnt==n-1) 
            {
                if(ans==-1||ans>(c[j].w-c[i].w)) ans=c[j].w-c[i].w;
                break;
            }
        }
    }
    printf("%d",ans);
    return 0;
}

  

posted @ 2019-03-25 17:45  CZD648  阅读(289)  评论(0编辑  收藏  举报
Live2D