- 通信线路
题目
提交记录
讨论
题解
视频讲解
在郊区有 N 座通信基站,P 条 双向 电缆,第 i 条电缆连接基站Ai和Bi。
特别地,1 号基站是通信公司的总站,N 号基站位于一座农场中。
现在,农场主希望对通信线路进行升级,其中升级第 i 条电缆需要花费Li。
电话公司正在举行优惠活动。
农产主可以指定一条从 1 号基站到 N 号基站的路径,并指定路径上不超过 K 条电缆,由电话公司免费提供升级服务。
农场主只需要支付在该路径上剩余的电缆中,升级价格最贵的那条电缆的花费即可。
求至少用多少钱可以完成升级。
输入格式
第1行:三个整数N,P,K。
第2…P+1行:第 i+1 行包含三个整数Ai,Bi,Li。
输出格式
包含一个整数表示最少花费。
若1号基站与N号基站之间不存在路径,则输出”-1”。
数据范围
0≤K<N≤1000,
1≤P≤10000,
1≤Li≤1000000
输入样例:
5 7 1
1 2 5
3 1 4
2 4 8
3 2 3
5 2 9
3 4 7
4 5 6
输出样例:
4
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e3+10,INF=0x3f3f3f3f;
int n,m,k;
int path[N][N];
int dist[N];
bool st[N];
int dijkstra(int u)
{
memset(st,0,sizeof(st));
memset(dist,0x3f,sizeof dist);
for(int i=1;i<=n;i++)
{
dist[i]=INF;
}
dist[1]=0;
for(int i=1;i<n-1;i++)
{
int minn=INF;
int temp;
for(int j=1;j<=n;j++)
{
if(!st[j]&&dist[j]<minn)
{
minn=dist[j];
temp=j;
}
}
if(st[n]) break;
st[temp]=1;
for(int j=1;j<=n;j++)
{
if(path[temp][j]==INF) continue;
int d=path[temp][j]>u;
dist[j]=min(dist[j],dist[temp]+d);
}
}
return dist[n];
}
int main()
{
cin>>n>>m>>k;
memset(path,0x3f,sizeof path);
int maxv=-INF;
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
path[a][b]=path[b][a]=min(c,path[a][b]);
maxv=max(maxv,c);
}
int l=0,r=maxv+1;
while(l<r)
{
int mid=(l+r)>>1;
if(dijkstra(mid)<=k)
r=mid;
else
l=mid+1;
}
if(l==maxv+1)
l=-1;
cout<<l<<endl;
return 0;
}