可能写的不是标准的分层图,但是学长说是一样的。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e4 + 5, M = 5e4 + 5, inf = 1e18, mod = 8e5;
int n, m, fir[N], nxt[M << 1], son[M << 1], tot, w[M << 1], x, y, z, K, dis[N][25], h, t, ans = inf;
bool vis[N][25];
struct data{
int x, y, dis;
const bool operator > (const data x)const {
return dis > x.dis;
}
}tp;
priority_queue<data, vector<data>, greater<data> >q;
inline void add(int x, int y, int z){
nxt[++tot] = fir[x];
fir[x] = tot;
son[tot] = y;
w[tot] = z;
}
signed main(){
// freopen("P2939_2.in", "r", stdin);
scanf("%lld%lld%lld", &n, &m, &K);
for(int i = 1; i <= m; i++){
scanf("%lld%lld%lld", &x, &y, &z);
add(x, y, z), add(y, x, z);
}
for(int i = 1; i <= n; i++) for(int j = 0; j <= K; j++) dis[i][j] = inf;
q.push((data){1, 0, 0}), dis[1][0] = 0, vis[1][0] = 1;
while(!q.empty()){
tp = q.top();
q.pop();
if(tp.dis > dis[tp.x][tp.y]) continue ;
for(int i = fir[tp.x]; i; i = nxt[i]){
if(dis[son[i]][tp.y] > dis[tp.x][tp.y] + w[i]){
dis[son[i]][tp.y] = dis[tp.x][tp.y] + w[i];
q.push((data){son[i], tp.y, dis[son[i]][tp.y]});
}
if(tp.y < K){
if(dis[son[i]][tp.y + 1] > dis[tp.x][tp.y]){
dis[son[i]][tp.y + 1] = dis[tp.x][tp.y];
q.push((data){son[i], tp.y, dis[son[i]][tp.y + 1]});
}
}
}
}
for(int i = 0; i <= K; i++) ans = min(ans, dis[n][K]);
printf("%lld", ans);
return 0;
}
谢谢。