6AC5WA求助
查看原帖
6AC5WA求助
996893
exLucas楼主2024/11/9 16:38
#include <bits/stdc++.h>
using namespace std;
const int N = 5e6 + 10, M = 7e6 + 10;
struct edge {
	int to, dis, nxt;
} e[M];
int head[N], cnt;
struct node {
	int dis, pos;
	bool operator < (const node x) const {
		return dis > x.dis;
	}
};
int dis[N];
bool vis[N];
int n, m, k, u, v, w, s, t;
void add(int u, int v, int w) {
	cnt ++, e[cnt].to = v, e[cnt].dis = w, e[cnt].nxt = head[u], head[u] = cnt;
	return ;
}
void dijkstra(int s) {
	memset(dis, 0x3f, sizeof dis);
	priority_queue<node> q;
	dis[s] = 0;
	q.push({0, s});
	while(q.size()) {
		node now = q.top();
		q.pop();
		int u = now.pos;
		if(vis[u]) continue;
		vis[u] = true;
		for(int i = head[u]; i; i = e[i].nxt) {
			int v = e[i].to;
			if(dis[v] > dis[u] + e[i].dis) {
				dis[v] = dis[u] + e[i].dis;
				q.push({dis[v], v});
			}
		}
	}
}
int main() {
	scanf("%d %d %d", &n, &m, &k);
	scanf("%d %d", &s, &t);
	memset(head, -1, sizeof head);
	s ++, t ++;
	for(int i = 1; i <= m; i ++) {
		scanf("%d %d %d", &u, &v, &w);
		u ++, v ++;
		add(u, v, w);
		add(v, u, w);
		for(int j = 1; j <= k; j ++) {
			add(u + (j - 1) * n, v + j * n, 0);
			add(v + (j - 1) * n, u + j * n, 0);
			add(u + j * n, v + j * n, w);
			add(u + j * n, v + j * n, w);
		}
	}
	for(int i = 1; i <= k; i ++) {
		add(t + (i - 1) * n, t + i * n, 0);
	}
	dijkstra(s);
	printf("%d", dis[t + k * n]);
	return 0;
}
2024/11/9 16:38
加载中...