네트워크 복구 2211

PublicMinsu·2023년 8월 26일

문제

접근 방법

문제가 너무 길고 단번에 이해하기 어렵게 적어놨다.
최소 스패닝 트리 문제 같지만

슈퍼컴퓨터가 다른 컴퓨터들과 통신하는데 걸리는 최소 시간이, 원래의 네트워크에서 통신하는데 걸리는 최소 시간보다 커져서는 안 된다.

이 부분 덕분에 다익스트라라는 것을 알 수 있게 됐다.

코드

#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;
typedef pair<int, int> pii;
typedef tuple<int, int, int> tiii;
int N, M, A, B, C;
vector<vector<pii>> graph;
vector<pii> ret;
vector<int> dist;
priority_queue<tiii, vector<tiii>, greater<tiii>> pq;
int main()
{
    ios::sync_with_stdio(0), cin.tie(0);
    cin >> N >> M;
    dist = vector<int>(N + 1, 100000);
    graph = vector<vector<pii>>(N + 1, vector<pii>());
    while (M--)
    {
        cin >> A >> B >> C;
        graph[A].push_back({B, C});
        graph[B].push_back({A, C});
    }
    pq.push({0, 0, 1});
    while (!pq.empty())
    {
        tiii curNode = pq.top();
        pq.pop();
        int value = get<0>(curNode);
        int prev = get<1>(curNode);
        int cur = get<2>(curNode);
        if (dist[cur] != 100000)
            continue;
        dist[cur] = value;
        ret.push_back({prev, cur});
        for (pii nextNode : graph[cur])
        {
            int next = nextNode.first;
            int nextValue = nextNode.second;
            if (value + nextValue >= dist[next])
                continue;
            pq.push({value + nextValue, cur, next});
        }
    }
    ret.erase(ret.begin());
    cout << ret.size() << "\n";
    for (pii cur : ret)
        cout << cur.first << " " << cur.second << "\n";
    return 0;
}

풀이

각자의 방식대로 채택된 노드와 그 노드의 부모를 기록하면 된다.

이후 모든 탐색이 끝났다면 해당 경로를 출력하면 된다.

profile
연락 : publicminsu@naver.com

0개의 댓글