코딩 공부/백준

[백준][C++] 1414 불우이웃돕기

김 정 환 2021. 4. 11. 13:50
반응형

www.acmicpc.net/problem/1414

 

1414번: 불우이웃돕기

첫째 줄에 컴퓨터의 개수 N이 주어진다. 둘째 줄부터 랜선의 길이가 주어진다. i번째 줄의 j번째 문자가 0인 경우는 컴퓨터 i와 컴퓨터 j를 연결하는 랜선이 없음을 의미한다. 그 외의 경우는 랜선

www.acmicpc.net

 

 

 

알고리즘 종류

MST

크루스칼

 

 

 

사고 과정

입력된 모든 랜선의 길이를 저장합니다. 그리고 크루스칼 알고리즘으로 MST를 만들면 연결된 길이를 빼줍니다. 그리고 모든 컴퓨터가 연결되었는지 확인해야 합니다. 모든 컴퓨터가 연결되어 있는지 확인할 수 있는 방법은 무엇일까요?

 

A노드와 B노드가 연결되어 있는지는 parents 배열에 저장해두었습니다. 그렇다면, 이 배열을 for문으로 순환하면서 부모가 모두 동일하다면 모든 노드가 연결되어 있는 것 입니다.

 

 

 

구현(C++)

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
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int n;
int total=0;
 
int parents[101];
vector<pair<intpair<intint> > > edges;
 
bool cmp(pair<intpair<intint> > a, pair<intpair<intint> > b){
    return a.first < b.first;
}
 
int get_parent(int a){
    if(parents[a] == a) return a;
    return parents[a] = get_parent(parents[a]);
}
 
void union_parents(int a, int b){
    a = get_parent(a);
    b = get_parent(b);
    
    if(a > b) parents[a] = b;
    else parents[b] = a;
}
 
void solution(){
    
    for(int i=1; i<=n; i++) parents[i] = i;
    sort(edges.begin(), edges.end(), cmp);
    
    for(int i=0; i<edges.size(); i++){
        int node1 = edges[i].second.first;
        int node2 = edges[i].second.second;
        int cost = edges[i].first;
        
        if(get_parent(node1) != get_parent(node2)){
            union_parents(node1, node2);
            total -= cost;
        }
    }
    
    int p = get_parent(1);
    for(int i=2; i<=n; i++){
        if(get_parent(i) != p){
            cout << -1 << endl;
            return;
        }
    }
    cout << total << endl;
}
 
int main(void){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n;
 
    char c;
    int cost;
    
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            cin >> c;
            
            if(c >= 'a' && c <= 'z'){
                cost = c - 'a' + 1;
                edges.push_back({cost, {i, j}});
                total += cost;
            }
            else if(c >= 'A' && c <= 'Z'){
                cost = c - 'A' + 27;
                edges.push_back({cost, {i, j}});
                total += cost;
            }
        }
    }
 
    solution();
}
cs

 

 

 

시행착오

 

 

 

 

 

반응형

'코딩 공부 > 백준' 카테고리의 다른 글

[백준][C++] 14499 주사위 굴리기  (0) 2021.04.11
[백준][C++] 3190 뱀  (0) 2021.04.11
[백준][C++] 1368 물대기  (0) 2021.04.11
[백준][C++] 12100 2048 (Easy)  (0) 2021.04.10
[백준][C++] 13460 구슬 탈출 2  (0) 2021.04.10