ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

# $\text{The K-th Shortest Path - }A^*$

2022-07-06 20:04:38  阅读:153  来源: 互联网

标签:int text pos Len vis th push Shortest define


\(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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有