$37pts$求助
查看原帖
$37pts$求助
1161545
_XSOI_楼主2024/6/9 15:23
#include <iostream>
#include <queue>
using namespace std;
const int inf = 2147483647;
const int MAXX = 3e6 + 11;
int n,m,k,s,t,cnt;
int dis[MAXX];
int to[MAXX],nxt[MAXX],val[MAXX],h[MAXX];
bool vis[MAXX];
struct node {
	int v,w;
	friend bool operator < (node a,node b) {
		return a.w > b.w;
	}
} tmp;
priority_queue <node> q;
void add(int u,int v,int w) {
	to[++ cnt] = v;
	val[cnt] = w;
	nxt[cnt] = h[u];
	h[u] = cnt;
}
void dijkstra() {
	for (int i = 1; i <= n; i ++) {
		dis[i] = inf;
	}
	dis[s] = 0;
	tmp.v = s,tmp.w = 0;
	q.push(tmp);
	while(!q.empty()) {
		int u = q.top().v;
		q.pop();
		if (vis[u]) {
			continue;
		}
		vis[u] = 1;
		for (int i = h[u]; i; i = nxt[i]) {
			if (dis[to[i]] > (long long)dis[u] + val[i]) {
				dis[to[i]] = dis[u] + val[i];
				tmp.w = dis[to[i]];
				tmp.v = to[i];
				q.push(tmp);
			}
		}
	}
}
signed main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	cin >> n >> m >> k;
	cin >> s >> t;
	for (int i = 1,u,v,w; i <= m; i ++) {
		cin >> u >> v >> w;
		add(u,v,w);
		add(v,u,w);
		for (int j = 1; j <= k; j ++) {
			add(u + j * n,v + j * n,w);
			add(v + j * n,u + j * n,w);
			add(u + j * n - n,v + j * n,0);
			add(v + j * n - n,u + j * n,0);
		}
	}
	dijkstra();
	int ans = inf;
	for (int i = 0; i <= k; i ++) {
		if (dis[t + i * n] < ans) {
			ans = dis[t + i * n];
		}
	}
	cout << ans;
	return 0;
}
2024/6/9 15:23
加载中...