问
查看原帖
问
565707
mediocre_楼主2024/8/27 18:42

题解区没我这种做法能否申请发题解?(虽然还没写

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005, K = 101;
int n, m, k, dis[K][MAXN];
struct Node {
	int pos, dis;
	friend bool operator<(Node a, Node b) {
		return a.dis > b.dis;
	}
} ;
vector <Node> p[MAXN]; 
priority_queue <Node> q;
void dijkstra() {
	for (int i = 1; i <= n; ++i)
		for (int j = 0; j < k; ++j)
			dis[j][i] = INT_MAX;
	dis[0][n] = 0;
	q.push({n, 0});
	while (!q.empty()) {
		Node u = q.top();
		q.pop();
		if (u.dis > dis[k - 1][u.pos]) continue;
		for (int i = 0; i < p[u.pos].size(); ++i) {
			int to = p[u.pos][i].pos;
			int w = p[u.pos][i].dis;
			for (int j = 0; j < k; ++j)
				if (dis[j][to] > u.dis + w) {
					for (int t = k - 1; t > j; --t)
						dis[t][to] = dis[t - 1][to];
					dis[j][to] = u.dis + w;
					q.push({to, dis[j][to]});
					break;
				}
		}
		//for (int i = 1; i <= n; ++i, puts(""))
		//	for (int j = 0; j < k; ++j)
		//		printf("%d ", dis[j][i]);
	}
}
int main() {
	scanf("%d%d%d", &n, &m, &k);
	while (m--) {
		int u, v, w;
		scanf("%d%d%d", &u, &v, &w);
		p[max(u, v)].push_back({min(u, v), w});
	}
	dijkstra();
    for (int i = 0; i < k; ++i) 
	    printf("%d\n", (dis[i][1] != INT_MAX) ? dis[i][1] : -1);
	return 0;
}
2024/8/27 18:42
加载中...