#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int n,k,m;
const int MAX_N = 10010;
const int INF = 1011111111;
struct edge{
int v;
int cost;
edge(int _v, int _cost): v(_v),cost(_cost){}
};
vector <edge> E[MAX_N];
void addedge(int u, int v, int w){
E[u].push_back(edge(v,w));
}
bool vis[MAX_N];
int d[MAX_N];
int spfa(int lim){
memset(vis, false, sizeof(vis));
for(int i = 0; i < n; i++)
d[i] = INF;
vis[0] = true;
d[0] = 0;
queue<int> que;
while(!que.empty()) que.pop();
que.push(0);
while(!que.empty()){
int u = que.front(); que.pop();
vis[u] = false;
for(int i = 0;i < E[u].size(); i++){
edge &e = E[u][i];
int c = e.cost > lim ? 1 : 0;
if(d[e.v] > d[u] + c){
d[e.v] = d[u] + c;
if(!vis[e.v]){
vis[e.v] = true;
que.push(e.v);
}
}
}
}
return d[n-1];
}
int main(){
scanf("%d%d%d", &n, &m, &k);
int x, y,z;
for(int i = 0;i < m; i++){
scanf("%d%d%d", &x, &y, &z);
addedge(x-1,y-1,z);
addedge(y-1,x-1,z);
}
int lb = -1, rb = INF;
while(rb - lb > 1){
int mid = (rb + lb) / 2;
if(spfa(mid) <= k) rb = mid;
else lb = mid ;
}
if(rb == INF) rb = -1;
printf("%d\n", rb);
return 0;
}
poj3662
最新推荐文章于 2021-04-19 13:36:40 发布