您的位置:首页 > 其它

计蒜客习题:高速公路

2018-03-24 17:47 246 查看

问题描述

蒜头君所在的国家有 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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: