k层图典型例题就是可以任意选取k条边使得他们权值变化
然后问最短路
//
// Created by xingchaoyue on 2019/7/27.
//
#include<iostream>
#include<cstdio>
#include<queue>
#include<string.h>
using namespace std;
const int N = 220010;
struct Edge{
int to,nexty,w;
}edge[4200010];
bool vis[N];
int n,m,u,v,k,t,tmp;
int dis[N];
int head[N],cnt;
void add(int x,int y,int w){
cnt++;
edge[cnt].to = y;
edge[cnt].nexty = head[x];
edge[cnt].w = w;
head[x] = cnt;
}
priority_queue< pair<int,int> >q;
void dij(){
memset(dis,0x3f,sizeof(dis));
dis[1] = 0;
memset(vis,0,sizeof(vis));
q.push(make_pair(0,1));
while(q.size()){
int x = q.top().second;
q.pop();
if(vis[x])continue;
vis[x] = 1;
for(int i = head[x];i;i=edge[i].nexty){
int y = edge[i].to;
int z = edge[i].w;
if(dis[y]>dis[x]+z){
dis[y] = dis[x]+z;
q.push(make_pair(-dis[y],y));
}
}
}
}
int main(){
// int n,m,k;
cin>>n>>m>>k;
for(int i =1;i<=m;++i){
int u,v,t;
cin>>u>>v>>t;
add(u,v,t);
add(v,u,t);
for(int j =1;j<=k;++j){
add(j*n+u,j*n+v,t);
add(j*n+v,j*n+u,t);
add((j-1)*n+u,j*n+v,0);
add((j-1)*n+v,j*n+u,0);
}
}
tmp = n;
dij();
int ans = dis[tmp];
for(int i =1;i<=k;++i){
ans = min(ans,dis[i*n+tmp]);
}
cout<<ans<<endl;
}