分层图模板,在判断条件进行更改即可,因为要求最大边,所以每次转移最大边即可。
#include <bits/stdc++.h>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
typedef pair<int,int> PII;
const int N=1e4+10;//注意边的范围,由于我们重新构图 500*500最坏
int n,m,k,ans,ecnt;
int head[1010],vis[1010][1010];
int d[1010][1010];
struct edge {
int u,v,next,w;
} E[N<<1];
struct node {
int u,used;//当前点u,使用了几次免费
};
void add(int u,int v,int w) {
E[++ecnt].u=u;
E[ecnt].v=v;
E[ecnt].w=w;
E[ecnt].next=head[u];
head[u]=ecnt;
}
//跑一遍spfa
void spfa(int u) {
memset(d,INF,sizeof d);
d[u][0]=0;
vis[u][0]=1;
node s= {u,0};
queue<node> q;
q.push(s);
while(!q.empty()) {
node t=q.front();
q.pop();
vis[t.u][t.used]=0;
for(int i=head[t.u]; i; i=E[i].next) {
int v=E[i].v;
//不用
if(d[v][t.used]>max(d[t.u][t.used],E[i].w)) {//转移最大值
d[v][t.used]=max(d[t.u][t.used],E[i].w);
if(!vis[v][t.used]) {
vis[v][t.used]=1;
q.push({v,t.used});
}
}
//用
if(t.used+1<=k&&d[v][t.used+1]>d[t.u][t.used]) {
d[v][t.used+1]=d[t.u][t.used];
if(!vis[v][t.used+1]) {
vis[v][t.used+1]=1;
q.push({v,t.used+1});
}
}
}
}
}
int main() {
cin>>n>>m>>k;
for(int i=1; i<=m; i++) {
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
spfa(1);
ans=INF;
for(int i=0; i<=k; i++) {//找出最小值
ans=min(ans,d[n][i]);
}
if(ans==INF){
cout<<-1<<endl;
return 0;
}
cout<<ans<<endl;
return 0;
}