社区讨论

K短路代码求助

学术版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mi7yhvp9
此快照首次捕获于
2025/11/21 05:41
4 个月前
此快照最后确认于
2025/11/21 05:41
4 个月前
查看原帖
CPP
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <iostream>
#include <algorithm>
using namespace std;

template <typename Type>
inline int read(Type& x) {
    x = 0; char c = getchar(), f = 1;
    for(; c < '0' || c > '9'; c = getchar())
        if(c == -1) return -1;
        else if(c == '-') f = -1;
    for(; c >= '0' && c <='9'; c = getchar())
        x = (x << 1) + (x << 3) + (c ^ 48);
    x *= f; return 1;
}
template <typename Type>
inline int write(Type x) {
    if(x < 0) putchar('-'), x = (~x) + 1;
    if(x / 10) { return write(x / 10) && putchar(x % 10 | 48); }
    return putchar(x % 10 | 48);
}
template <typename Type>
inline int write(Type x, char c) { return write(x) && putchar(c); }

int n, m;
struct edge {
    int u; long long w;
    inline edge(int U = 0, long long W = 0) { u = U, w = W; }
    inline bool operator < (const edge& b) const { return w > b.w; }
};
vector<edge> G[1001], R[1001];
int s, e, k;
int dis[1001]; int vis[1001];
inline void Dijkstra(int s) {
    priority_queue<edge> q;
    q.push(s);
    memset(dis, 0x3f, sizeof dis);
    memset(vis, 0, sizeof vis);
    dis[s] = 0;
    while(!q.empty()) {
        edge t = q.top(); q.pop();
        if(t.w != dis[t.u] || vis[t.u]) continue;
        vis[t.u] = 1;
        for(int i = 0; i < int(R[t.u].size()); i++) {
            edge t1 = R[t.u][i];
            if(!vis[t1.u] && dis[t1.u] > dis[t.u] + t1.w) {
                dis[t1.u] = dis[t.u] + t1.w;
                t1.w = dis[t1.u];
                q.push(t1);
            }
        }
    }
}
struct node {
    int u; long long g, h;
    inline node(int U = 0, long long G = 0, long long H = 0) { u = U, g = G, h = H; }
    inline bool operator < (const node& rhs) const { return g + h > rhs.g + rhs.h; }
};
inline long long KthPath(int s, int e, int k) {
    if(dis[s] == 0x3f3f3f3f) return -1;
    memset(vis, 0, sizeof vis);
    priority_queue<node> q;
    q.push(node(s, 0, dis[s]));
    while(!q.empty()) {
        node t = q.top(); q.pop();
        int u = t.u;
        for(int i = 0; i < int(G[u].size()); i++) {
            node t1(G[u][i].u, t.g + G[u][i].w, dis[G[u][i].u]);
            vis[t1.u]++;
            if(t1.u == e && vis[t1.u] == k) return t1.g + t1.h;
            q.push(t1);
        }
    }
    return -1;
}

inline bool cmp(edge a, edge b) { return a.w < b.w; }
int main() {
    read(n), read(m);
    for(int i = 1; i <= m; i++) {
        int u, v, w; read(u), read(v), read(w);
        G[u].push_back(edge(v, w));
        R[v].push_back(edge(u, w));
    }
    for(int i = 1; i <= n; i++)
        sort(G[i].begin(), G[i].end(), cmp);
    read(s); read(e); read(k);
    Dijkstra(e);
    long long ans = KthPath(s, e, k);
    write(ans);
}

回复

0 条回复,欢迎继续交流。

正在加载回复...