传送门biu~
二分答案,找最短路使路径上大于答案的边不超过k条。
#include<bits/stdc++.h>
using namespace std;
int n,p,k;
int head[1005],nex[20005],to[20005],v[20005],tp;
inline void add(int x,int y,int z){
nex[++tp]=head[x];
head[x]=tp;
to[tp]=y;
v[tp]=z;
}
int dis[1005];
bool in[1005];
bool spfa(int p){
memset(dis,0x3f,sizeof(dis));
queue<int>q;
q.push(1);
dis[1]=0;in[1]=1;
while(!q.empty()){
int x=q.front();q.pop();in[x]=0;
for(int i=head[x];i;i=nex[i]){
int now=dis[x];
if(v[i]>p) ++now;
if(now<dis[to[i]]){
dis[to[i]]=now;
if(!in[to[i]]){
in[to[i]]=1;
q.push(to[i]);
}
}
}
}
return dis[n]<=k;
}
int search(){
int re=-1;
int L=0,R=1000000;
while(L<=R){
int mid=L+R>>1;
if(spfa(mid)) re=mid,R=mid-1;
else L=mid+1;
}
return re;
}
int main(){
scanf("%d%d%d",&n,&p,&k);
for(int i=1;i<=p;++i){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
printf("%d",search());
return 0;
}