求助dijskra91分wa在#3
查看原帖
求助dijskra91分wa在#3
920358
kmguochang楼主2024/9/17 20:59
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 66;

struct Edge {
	int next, to, data;
} e[N * 666];

struct node {
	int dis, val;
	bool friend operator<(node x, node y) {
		return x.dis > y.dis;
	}
};
int head[N * 10], cnt, n, m, k, s, t, dis[N * 10];
bool book[N * 10];
priority_queue<node> q;

inline void add(int from, int to, int data) {
	e[++cnt].next = head[from], head[from] = cnt, e[cnt].data = data, e[cnt].to = to;
	return;
}

void dij() {
	memset(dis, 0xf7f7f7f7f, sizeof(dis));
	q.push(node{0, s});
	dis[s] = 0;
	int u, v;

	while (!q.empty()) {
		u = q.top().val, q.pop();

		if (book[u])
			continue;
		book[u] = true;

		for (int i = head[u]; i; i = e[i].next) {

			v = e[i].to;

			if (dis[v] > dis[u] + e[i].data) {
				dis[v] = dis[u] + e[i].data;
				q.push(node{dis[v], v});
			}
		}
	}

	return;
}

int main() {
	scanf("%d%d%d%d%d", &n, &m, &k, &s, &t);
	int u, uu, v, vv, w, u1, v1, ans = INT_MAX;
	s++, t++;

	for (int i = 1; i <= m; ++i) {

		scanf("%d%d%d", &u, &v, &w);
		u++, v++;
		uu = u1 = u, vv = v1 = v;
		add(uu, vv, w), add(vv, uu, w);

		for (int j = 0; j < k; ++j) {

			uu += n, vv += n;
			add(uu, vv, w), add(vv, uu, w);
			add(u1, vv, 0), add(v1, uu, 0);
			u1 += n, v1 += n;
		}
	}

	dij();

	for (int i = 0; i < k; ++i)

		add(i * n + t, n * k + t, 0);
	ans = min(ans, dis[k * n + t]);
	printf("%d", ans);
	return 0;
}
2024/9/17 20:59
加载中...