计蒜客习题:高速公路
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; }