9pts, 求助
查看原帖
9pts, 求助
461359
huangrenheluogu楼主2023/7/11 13:38

可能写的不是标准的分层图,但是学长说是一样的。

#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;
} 

谢谢。

2023/7/11 13:38
加载中...