# $\text{The K-th Shortest Path - }A^*$
作者:互联网
\(k\) 短路模板。
应该是有另解的...
\(\text{Luogu P2680}\) \(\large\to\text{Link}\leftarrow\)
放个代码:
#include <bits/stdc++.h>
#define pii pair <int, int>
#define Mp make_pair
#define xi first
#define yi second
#define LL long long
#define rg register
using namespace std;
const int N = 1e3 + 5, M = 1e6 + 10;
int n, m, k;
struct E { int x, y; };
vector <E> Link[N], Lx[N];
int d[N], vis[N];
inline void spfa() { // 跑反向图,预处理 d[]
deque <int> Q;
memset(d, 0x7f, sizeof(d));
memset(vis, 0, sizeof(vis));
vis[1] = true;
while(Q.size()) {
rg int u = Q.front(); Q.pop_front();
vis[u] = false;
for(auto v : Lx[u]) {
if(d[v.x] > d[u] + v.y) {
d[v.x] = d[u] + v.y;
if(!vis[v.x]) {
vis[v.x] = true;
if(!Q.empty() && d[v.x] < d[Q.front()]) Q.push_front(v.x);
else Q.push_back(v.x);
}
}
}
}
}
struct Node {
int pos; LL Len;
};
bool operator < (Node a, Node b) {
return a.Len + d[a.pos] > b.Len + d[b.pos];
}
inline int Astar (int &ret) {
priority_queue <Node> Q;
Q.push({n, 0});
while(Q.size()) {
Node u = Q.top(); Q.pop();
if(u.pos == 1) {
printf("%lld\n", u.Len);
if(! --ret) return 0;
}
for(auto v : Link[u.pos]) Q.push({v.x, u.Len + v.y});
}
return ret;
}
signed main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("Ans.txt", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> k;
for(rg int i = 1; i <= m; i++) {
int u, v, w; cin >> u >> v >> w;
Link[u].push_back({v, w});
Lx[v].push_back({u, w});
}
spfa();
Astar(k);
while(k--) puts("-1");
return 0;
}
标签:int,text,pos,Len,vis,th,push,Shortest,define 来源: https://www.cnblogs.com/Doge297778/p/16452295.html