WA on #3 求调 Dijkstra
查看原帖
WA on #3 求调 Dijkstra
1268678
thrniseven楼主2024/8/16 22:09


#include <queue>
#include <iostream>
#include <algorithm>
#include <vector>
#include <deque>
#include <cstring>
#include<tuple>
using namespace std;
const long long  N = 1e4 + 1;
const long long  M = 1e5;
long long  to[M];
long long  nex[M];
long long  w[M];
long long  head[N];
long long  cnt = 0;
long long  dis[N][20];
long long  visit[N][20];
void built(long long  u, long long  v, long long  w1) {
	nex[cnt] = head[u];
	to[cnt] = v;
	w[cnt] = w1;
	head[u] = cnt++;
}
int  main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
		for (long long  i = 0; i < N; i++) {
			for (long long  j = 0; j < 10; j++) {
				dis[i][j] = 0x3f3f3f3f;
			}
		}
	memset(head, -1, sizeof(head));
	long long  n, m, k, s, e;
	cin >> n >> m >> k >> s >> e;
	for (long long  i = 0; i < m; i++) {
		long long  a, b; long long  c;
		cin >> a >> b >> c;
		built(a, b, c);
		built(b, a, c);
	}
	auto cmp = [](auto& a, auto& b) {
		return get<2>(a) > get<2>(b);
		};
	priority_queue<tuple<long long , long long , long long >,
		vector<tuple<long long , long long , long long >>, decltype(cmp)>
		q(cmp);
	q.emplace(s, 0, 0);
	while (!q.empty()) {
		long long  cur = get<0>(q.top());
		long long  ft = get<1>(q.top());
		long long  c = get<2>(q.top());


		q.pop();
		if (visit[cur][ft])
			continue;
		visit[cur][ft] = 1;
		if (cur == e) {
			cout << c;
			return 0;
		}
		for (long long  i = head[cur]; i != -1; i = nex[i]) {

			if (!visit[to[i]][ft] && w[i] + c < dis[to[i]][ft]) {
				dis[to[i]][ft] = w[i] + c;
				q.emplace(to[i], ft, dis[to[i]][ft]);
			}

			if (ft < k && !visit[to[i]][ft + 1] && c < dis[to[i]][ft + 1]) {
				dis[to[i]][ft + 1] = c;
				q.emplace(to[i], ft + 1, dis[to[i]][ft + 1]);
			}
		}
	}
	return 0;
}
2024/8/16 22:09
加载中...