计蒜客习题:高速公路

版权声明:本文为博主原创文章,未经博主允许也可以转载。 https://blog.csdn.net/Liukairui/article/details/79680098

问题描述

蒜头君所在的国家有 n 个城市,现在需要在城市之间修高速公路,有 m 条修路的方案,每个方案表示 a, b 城市之间修一条限速为 c 的高速公路。蒜头君希望从这 m 个方案中选出若干方法试行,能够让 n 座城市联通,并且希望所有高速公路中最高限速和最低限速的差值最小。
输入格式
第一行输入两个整数 n,m(2≤n≤100,1<=m<=n(n-1)/2 ),表示有 n 个城市,m 条修路方案。两个城市之间可能会有多条修路方案。
接下来输入 m 行,每行输入三个整数 a,b,c(1≤a,b≤n,0≤c≤1,0000)。
输出格式
如果修路方案不能让 nn 个城市之间联通,输出 -1,否者输出最小的差值。
样例输入
4 4
1 2 2
2 3 4
1 4 1
3 4 2
样例输出
1


AC代码

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;

struct edge {
    int u,v,w;
}e[5000];

int dad[110];
int n,m;

int getdad(int i)
{
    if(dad[i]==i)return dad[i];
    return dad[i]=getdad(dad[i]);
}

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

int getmintree(int a)
{
    for(int i=0;i<=105;i++)
    {
        dad[i]=i;
    }
    int rest=n;
    int maxn=-0x3f3f3f3f;
    int minn=0x3f3f3f3f;
    for(int i=a+1;i<=m&&rest>1;i++)
    {
        if(i!=a){
            if(getdad(e[i].u)!=getdad(e[i].v))
        {
            dad[getdad(e[i].u)]=getdad(e[i].v);
            maxn=max(maxn,e[i].w);
            minn=min(minn,e[i].w);
            rest--;
        }
        }


    }
    if (rest>1)return 0x3f3f3f3f; 
    return maxn-minn;
}


int main()
{

    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        if(x==y)continue; 
        e[i].u=x;
        e[i].v=y;
        e[i].w=z;
    }
    sort(e+1,e+m+1,cmp);
    int ans=0x3f3f3f3f;
    for(int i=1;i<=m;i++)
    {
        ans=min(ans,getmintree(i));
    }
    if(ans==0x3f3f3f3f)cout<<"-1";
    else cout<<ans; 
    return 0;

}
阅读更多

扫码向博主提问

Liukairui

非学,无以致疑;非问,无以广识
去开通我的Chat快问
换一批

没有更多推荐了,返回首页