专栏文章

题解:AT_abc417_e [ABC417E] A Path in A Dictionary

AT_abc417_e题解参与者 5已保存评论 4

文章操作

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

当前评论
4 条
当前快照
1 份
快照标识符
@miok2bi9
此快照首次捕获于
2025/12/02 20:29
3 个月前
此快照最后确认于
2025/12/02 20:29
3 个月前
查看原文

说在前面

前置芝士:最短路。

题目分析

其实这是一道很简单的题,vector 是可以支持大小的比较的,即字典序。
于是我们把 dijkstra 的松弛操作改为 vector 的比较即可。用 dd 数组存下路径。
我们每一步走的都是当前的最优路径,那么答案一定也是最优的。

完整代码

CPP
#include <bits/stdc++.h>

#define int long long
#define endl "\n"

using namespace std;

namespace zcq_qwq {
    const int N = 1000 + 5, M = 50000 + 5;

    int h[N], to[M << 1], nxt[M << 1];

    vector<int> d[N];

    bool vis[N];

    int t, n, m, tot, s, ed;

    void add(int a, int b) {
        to[tot] = b;
        nxt[tot] = h[a];
        h[a] = tot++;
    }

    struct node {
        vector<int> f;

        int u;

        bool operator < (const node & x) const {
            return f > x.f;
        }
    };

    void dijkstra(int st) {
        for (int i = 1; i <= n; i++) {
            d[i] = {0x3f3f3f3f};
        }
        memset(vis, 0, sizeof vis);
        priority_queue<node> pq;
        d[st] = {st};
        pq.push({d[st], st});
        while (!pq.empty()) {
            node u = pq.top();
            pq.pop();
            if (vis[u.u]) continue;
            vis[u.u] = true;
            for (int i = h[u.u]; ~i; i = nxt[i]) {
                int j = to[i];
                vector<int> vec;
                vec = d[u.u];
                vec.push_back(j);
                if (d[j] > vec) {
                    d[j] = vec;
                    pq.push({d[j], j});
                }
            }
        }
    }

    void solve() {
        memset(h, -1, sizeof h);
        memset(to, 0, sizeof to);
        memset(nxt, 0, sizeof nxt);
        tot = 0;
        cin >> n >> m >> s >> ed;
        for (int i = 1; i <= m; i++) {
            int u, v;
            cin >> u >> v;
            add(u, v);
            add(v, u);
        }
        dijkstra(s);
        for (auto i : d[ed]) {
            cout << i << " ";
        }
        cout << endl;
    }

    void main() {
        cin >> t;
        while (t--) {
            solve();
        }
    }
}

signed main() {
    zcq_qwq::main();
    return 0;
}

说在后面

若代码、思路讲解有误,欢迎提出!

评论

4 条评论,欢迎与作者交流。

正在加载评论...