AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 其它
    • 题解
    • 分享
    • 商店
    • 问答
  • 吐槽
  • 登录/注册

AcWing 854. Johnson 算法    原题链接    简单

作者: 作者的头像   Yangchang ,  2023-01-25 23:28:12 ,  所有人可见 ,  阅读 13


0


#include <bits/stdc++.h>
#define cint const int &
#define pii pair<int, int>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 201, maxm = 20001;
struct {
    int nxt, v, w;
} edge[maxm + maxn];
struct {
    int nxt, y;
} qry[maxn * maxn];
int head[maxn], qrys[maxn], cnt, qcnt, n, m, k, x, y, z;
inline void addedge(cint u, cint v, cint w) {
    edge[++cnt] = {head[u], v, w};
    head[u] = cnt;
}
inline void addqry(cint x, cint y) {
    qry[++qcnt] = {qrys[x], y};
    qrys[x] = qcnt;
}
int h[maxn], dis[maxn];
bool vis[maxn];
inline void spfa(cint s, cint n) {
    static queue<int> q;
    memset(h, inf, sizeof(h[0]) * (n + 1));
    memset(vis, 0, n + 1);
    q.push(s); h[s] = 0;
    while (!q.empty()) {
        const int u = q.front();
        q.pop(); vis[u] = 0;
        for (int i = head[u]; i; i = edge[i].nxt) {
            const int v = edge[i].v, w = edge[i].w;
            if (h[v] > h[u] + w) {
                h[v] = h[u] + w;
                if (!vis[v])
                    vis[v] = 1,
                    q.push(v);
            }
        }
    }
}
inline void dijkstra(cint s, cint n) {
    static priority_queue<pii, vector<pii>, greater<pii>> pq;
    memset(dis, inf, sizeof(dis[0]) * (n + 1));
    memset(vis, 0, n + 1);
    pq.push({dis[s] = 0, s});
    int u, du;
    while (!pq.empty()) {
        tie(du, u) = pq.top();
        pq.pop();
        if (vis[u]) continue;
        vis[u] = 1;
        for (int i = head[u]; i; i = edge[i].nxt) {
            const int v = edge[i].v, w = edge[i].w;
            if (dis[v] > du + w)
                pq.push({dis[v] = du + w, v});
        }
    }
}
signed main() {
    ios::sync_with_stdio(0), cin.tie(0);
    //  ifstream ifs(".in");
    //  ofstream ofs(".out");
    //  cin.rdbuf(ifs.rdbuf()),cout.rdbuf(ofs.rdbuf());
    cin >> n >> m >> k;
    for (int i = 1; i <= m; ++i)
        cin >> x >> y >> z, addedge(x, y, z);
    for (int i = 1; i <= k; ++i)
        cin >> x >> y, addqry(x, y);
    for (int i = 1; i <= n; ++i)
        addedge(0, i, 0);
    spfa(0, n);
    for (int u = 1; u <= n; ++u)
        for (int i = head[u]; i; i = edge[i].nxt)
            edge[i].w += h[u] - h[edge[i].v];
    for (int x = 1; x <= n; ++x) {
        dijkstra(x, n);
        for (int i = qrys[x]; i; i = qry[i].nxt) {
            const int y = qry[i].y;
            if (dis[y] == inf) qry[i].y = inf;
            else qry[i].y = dis[y] - h[x] + h[y];
        }
    }
    for (int i = 1; i <= k; ++i)
        if (qry[i].y == inf) cout << "impossible\n";
        else cout << qry[i].y << '\n';
}

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息