zoukankan      html  css  js  c++  java
  • 最平衡生成树

    题目描述
    学习完最小生成树后,老师只给出几道模板题,为了尽快提升自己的编程能力,小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;
    }
    

      

  • 相关阅读:
    11.29 两百字
    Django:基础知识
    deepdiff:对比文件
    openpyxl:二次封装
    openpyxl:openpyxl的随笔
    web:pykeyboard、pymouse得使用
    Jmeter:如何让线程顺序执行
    Jmeter:如何将上一个线程得变量使用到下一个线程中,将上一个线程变量设置为全局变量
    Jmeter:BeanShell中的vars.put(string,string)
    Jmeter:数据库查询当天的日期
  • 原文地址:https://www.cnblogs.com/chen-1/p/10595199.html
Copyright © 2011-2022 走看看