본문 바로가기

알고리즘/BOJ

2211번

2211번 - 네트워크 복구


다익스트라를 이용해서 최단 거리를 구하면 된다.


슈퍼컴퓨터로 부터 모든 노드들의 최단거리를 구하면 주어진 조건에 맞게 된다.


그리고 BFS,다익스트라,벨만포드는 전부 parent 배열을 만들어서 , 


dist 값이 갱신될 때 parent 값들을 넣어주면 실제 경로를 구할 수 있다.



몇몇 사람들은 MST ( 최소 스패닝 트리) 로 접근한 사람들도 있는데... 2번 조건 때문에 안되는 것 같다.


모든 노드들의 합이 최소라고 해서, 그 노드들이 슈퍼컴퓨터로 부터 최단거리로 연결한다고 보장할 수 없기 때문이다?


사실 정확히 확신은 안가지만, 다익스트라로 확실히 풀 수 있다.


##추가로


밑에 코드에서 ans를 통해 간선의 갯수를 구했는데..


n개의 정점에서 최소의 간선은 n-1입니다.(신장트리)    라고 한다...

<정답 코드>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int INF = 987654321;
int main()
{
    int n, m;
    scanf("%d %d"&n, &m);
 
    vector<vector<pair<int,int>>> v(n + 1);
    vector<int> dist(n + 1,INF);
    vector<int> parent(n + 1,-1);
    for (int i = 0; i < m; i++)
    {
        int a, b, c;
        scanf("%d %d %d"&a, &b, &c);
        v[a].push_back({ b,c });
        v[b].push_back({ a,c });
    }
 
    priority_queue<pair<intint>> q;
    dist[1= 0;
    q.push({ 1,dist[1] });
 
    while (!q.empty())
    {
        int now = q.top().first;
        int cost = -q.top().second;
        q.pop();
 
        if (cost > dist[now]) { continue; };
 
        for (int i = 0; i < v[now].size(); i++)
        {
            int next = v[now][i].first;
            int w = v[now][i].second;
 
            if (dist[next] > cost + w)
            {
                dist[next] = cost + w;
                parent[next] = now;
                q.push({ next,-dist[next] });
            }
        }
    }
    int ans = 0;
 
    for (int i = 1; i <= n; i++)
    {
        if (dist[i] < INF && parent[i] !=-1)
        {
            ans++;
        }
    }
    printf("%d\n", ans);
    for (int i = 1; i <= n; i++)
    {
        if (dist[i] < INF && parent[i] != -1)
        {    
            printf("%d %d\n" ,i, parent[i]);
        }
    }
 
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

5567번  (0) 2018.01.08
5719번  (1) 2018.01.06
10282번  (0) 2018.01.04
6593번  (0) 2018.01.04
4485번  (0) 2018.01.04