2 min read

๋ฐฑ์ค€ 9370๋ฒˆ ๋ฏธํ™•์ธ ๋„์ฐฉ์ง€

๋ฌธ์ œ ๋งํฌ

edge(g,h)edge(g, h)๋ฅผ ์ง€๋‚˜๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ? cost(s,e)cost(s, e)์™€ cost(s,g)+cost(g,h)+cost(h,e)cost(s, g) + cost(g, h) + cost(h, e)๋ฅผ ๋น„๊ตํ•ด์„œ ๊ฐ™์œผ๋ฉด ์ตœ๋‹จ๊ฑฐ๋ฆฌ์— edge(g,h)edge(g, h)๊ฐ€ ํฌํ•จ๋œ ๊ฒƒ์ด๋‹ค. ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜ํ”„ ์ตœ๋‹จ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ฆฌ

๊ฐ„์„ ์„ ๋ฐ˜๋Œ€๋กœ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์Œ์— ์œ ์˜ํ•˜์ž.

#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using ld = long double;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int T;
    cin >> T;
    while (T--) {
        int n, m, t, s, g, h, gh;
        cin >> n >> m >> t >> s >> g >> h;
        vector<vector<pair<int, int>>> adj(n+1); // d, next 
        for (int i = 0; i < m; i++) {
            int a, b, d;
            cin >> a >> b >> d;
            adj[a].emplace_back(d, b);
            adj[b].emplace_back(d, a);
            if (a == g && b == h || a == h && b == g) gh = d;
        }
        vector<int> dest(t);
        for (auto& x : dest) {
            cin >> x;
        }

        auto dijkstra = [&](int start, int end, int dist[]) {
            priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // cost, node
            fill(dist, dist+2001, 1e9);
            dist[start] = 0;
            pq.emplace(0, start);
            while (pq.size()) {
                auto [cost, cur] = pq.top();
                pq.pop();
                if (dist[cur] < cost) continue;
                for (auto [nc, next] : adj[cur]) {
                    if (dist[cur] + nc < dist[next]) {
                        dist[next] = dist[cur] + nc;
                        pq.emplace(dist[next], next);
                    }
                }
            }
            return dist[end];
        };

        // s -> x ์ตœ๋‹จ๊ฑฐ๋ฆฌ
        // s -> g -> h -> x / s -> h -> g -> x ์ตœ๋‹จ๊ฑฐ๋ฆฌ
        set<int> ans;
        for (auto x : dest) {
            int dist[2001];
            int total = dijkstra(s, x, dist);
            int sghx = dist[g] + gh;
            int shgx = dist[h] + gh;
            sghx += dijkstra(h, x, dist);
            shgx += dijkstra(g, x, dist);
            if (total == sghx || total == shgx) {
                ans.emplace(x);
            }
        }
        for (auto x : ans) {
            cout << x << ' ';
        }
        cout << '\n';
    }

    return 0;
}

์™œ ๋žŒ๋‹ค๋ฅผ ์“ฐ๋‚˜์š”? ํ…Œ์ผ€ ์—ฌ๋Ÿฌ๊ฐœ ๋Œ๋ฆฌ๋Š” ๋ฌธ์ œ์—์„œ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๊ธฐ๋„ ๊ท€์ฐฎ๊ณ , ํ•จ์ˆ˜ ์ธ์ž๋กœ ๋ฐ›๊ธฐ๋„ ๊ท€์ฐฎ์œผ๋‹ˆ๊นŒ.