본문 바로가기

Study/BOJ

BOJ - 네트워크 연결(1922)

 

코드

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
67
68
69
70
71
72
73
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
 
int N, M, answer;
 
typedef struct graph
{
    int v1;
    int v2;
    int cost;
} graph;
 
vector<graph> v;
 
bool comp(graph a, graph b)
{
    return a.cost < b.cost;
}
 
int getRoot(vector<int> &parent, int idx)
{
    if (parent[idx] == idx) return idx;
    else
    {
        parent[idx] = getRoot(parent, parent[idx]);
        return parent[idx];
    }
}
 
void merge(vector<int> &parent, int a, int b)
{
    a = getRoot(parent, a);
    b = getRoot(parent, b);
    if (a < b) parent[b] = a;
    else parent[a] = b;
}
 
bool find(vector<int> parent, int a, int b)
{
    a = getRoot(parent, a);
    b = getRoot(parent, b);
    if (a == b) return true;
    else return false;
}
 
int main()
{
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    cin >> N; cin >> M;
    vector<int> parent(N + 1);
    for(int i=1; i<=N; i++)
        parent[i] = i;
    for(int i=0; i<M; i++)
    {
        graph g;
        cin >> g.v1 >> g.v2 >> g.cost;
        v.push_back(g);
    }
    sort(v.begin(), v.end(), comp);
    for(int i=0; i<v.size(); i++)
    {
        if (!find(parent, v[i].v1, v[i].v2))
        {
            merge(parent, v[i].v1, v[i].v2);
            answer += v[i].cost;
        }
    }
    cout << answer << "\n";
    return (0);
}
cs

모든 컴퓨터를 연결하는 최소 비용을 구해라 -> Minimum Spanning Tree를 구해라! 라는 문제이므로 Union - Find를 이용한 Kruskal Algorithm을 적용하여 풀었다. 

 

# TIP

시간을 더 줄이기 위해서는 find함수를 따로 만들지 말고 getRoot(v[i].v1) != getRoot(v[i].v2) 인지를 확인해서 참이면 union하는 방식으로 진행하면 더 빠르다.

'Study > BOJ' 카테고리의 다른 글

BOJ - 행성 터널(2887)  (0) 2021.04.15
BOJ - 다리 만들기 2(17472)  (0) 2021.04.15
BOJ - 거짓말(1043)  (0) 2021.04.14
BOJ - 최소 스패닝 트리(1197)  (0) 2021.04.14
BOJ - 미네랄(2933)  (0) 2021.04.12