Idea: A partir del significado de la pregunta, se puede ver que el valor máximo del lado k + 1 en una ruta de 1 a N es el más pequeño. Cuando miramos el valor máximo, podemos pensar en los dos puntos más pequeños. Cuando la variable pasada por la ruta de n es menor o igual que K), puede que no haya solución -1. Entonces, comenzamos desde 0-1e6 + 1 cuando dividimos el tiempo. Si la respuesta es 1e6 + 1, significa que no hay solución. Luego continuamos dividiendo el peso del lado K + 1 x, y luego ejecutamos el camino más corto en la imagen original. El peso del borde mayor que x se considera como 1, y los otros son 0, por lo que podemos saber si el número de bordes mayores que x es menor o igual que K cuando el peso del k + 1 borde es x, si se establece que nuestra x todavía es capaz de continuar hasta dos puntos. Sabiendo encontrar la solución óptima, debido a que el peso del borde es 01, usamos el BFS de cola de dos extremos para encontrar el camino más corto (puede darse prisa).
Código:
#pragma GCC optimize(2)#include<bits/stdc++.h>usingnamespace std;typedeflonglong ll;#define SIS std::ios::sync_with_stdio(false)#define space putchar(' ')#define enter putchar('\n')#define lson root<<1#define rson root<<1|1typedef pair<int,int> PII;typedef pair<int,PII> PIII;constint mod=1e9+7;constint N=2e5+5;constint inf=0x7f7f7f7f;intgcd(int a,int b){
return b==0?a:gcd(b,a%b);}
ll lcm(ll a,ll b){
return a*(b/gcd(a,b));}template<classT>voidread(T &x){
char c;bool op =0;while(c =getchar(), c <'0'|| c >'9')if(c =='-')
op =1;
x = c -'0';while(c =getchar(), c >='0'&& c <='9')
x = x *10+ c -'0';if(op)
x =-x;}template<classT>voidwrite(T x){
if(x <0)
x =-x,putchar('-');if(x >=10)write(x /10);putchar('0'+ x %10);}
ll qsm(int a,int b,int p){
ll res=1%p;while(b){
if(b&1)
res=res*a%p;
a=1ll*a*a%p;
b>>=1;}return res;}struct node
{
int nex,w,to;/* data */}edge[N];int head[N],tot;int n,m,k;int dis[N],vis[N];
deque<int> q;voidadd(int u,int v,int w){
edge[tot].to=v;
edge[tot].w=w;
edge[tot].nex=head[u];
head[u]=tot++;}boolcheck(int x){
memset(dis,inf,sizeof dis);memset(vis,0,sizeof vis);
dis[1]=0;
q.push_back(1);while(q.size()){
int now=q.front();q.pop_front();if(vis[now])continue;
vis[now]=1;for(int i=head[now];~i;i=edge[i].nex){
int v=edge[i].to,w=edge[i].w>x;if(dis[v]>dis[now]+w){
dis[v]=dis[now]+w;if(!w)q.push_front(v);else q.push_back(v);}}}return dis[n]<=k;}intmain(){
cin>>n>>m>>k;memset(head,-1,sizeof head);while(m--){
int a,b,c;
cin>>a>>b>>c;add(a,b,c);add(b,a,c);}int l=0,r=1e6+1;while(l<=r){
// cout<<111<<endl;int mid=l+r>>1;if(check(mid))r=mid-1;else l=mid+1;}if(r==1e6+1)
cout<<-1<<endl;else
cout<<l<<endl;return0;}