본문 바로가기
백준

백준 1922 네트워크 연결

by 콩순이냉장고 2020. 8. 30.

문제 URL : https://www.acmicpc.net/problem/1922

 

1922번: 네트워크 연결

이 경우에 1-3, 2-3, 3-4, 4-5, 4-6을 연결하면 주어진 output이 나오게 된다.

www.acmicpc.net

 

문제접근법 : 최소스패닝 트리 문제입니다.

크루스칼 알고리즘을 이용하는 기초적인 문제입니다. 

 

소스코드 : 

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
//By 콩순이냉장고
#include <vector>
#include <algorithm>
#include <iostream>
#include <queue>
#include <fstream>
using namespace std;
vector<pair<intpair<intint>>> v;
int n, e;
int parent[1001];
 
int find(int idx)
{
    if (parent[idx] == idx)
        return idx;
    return parent[idx] = find(parent[idx]);
}
bool sameparent(int &idx1, int &idx2)
{
    idx1 = find(idx1);
    idx2 = find(idx2);
    return idx1 == idx2;
}
void Union(int idx1, int idx2)
{
    if (idx1 != idx2)
        parent[idx2] = idx1;
}
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> e;
    int sum = 0;
    for (int i = 0; i < e; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        v.push_back({ c, { a, b } });
    }
    sort(v.begin(),v.end());
    for (int i = 1; i <= n; i++){
        parent[i] = i;
    }
 
    for (int i = 0; i < e; i++)
    {
        int left = v[i].second.first;
        int right = v[i].second.second;
        if (!sameparent(left, right))
        {
            sum += v[i].first;
            Union(left, right);
        }
    }
 
    cout << sum << endl;
}
cs

 

궁금한점 혹은 모르는점이 있다면 언제든지 댓글을 이용해주시길 바랍니다.

 

'백준' 카테고리의 다른 글

백준 4195 친구 네트워크  (0) 2020.08.30
백준 4386 별자리 만들기  (0) 2020.08.30
백준 5557 1학년  (0) 2020.08.26
백준 10473 인간 대포  (0) 2020.08.25
백준 1781 컵라면  (0) 2020.08.25