其他分享
首页 > 其他分享> > # $\text{The K-th Shortest Path - }A^*$

# $\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