题解区没我这种做法能否申请发题解?(虽然还没写
#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;
}