코딩 공부/백준

[백준][C++] 14950 정복자

김 정 환 2021. 3. 27. 16:43
반응형

www.acmicpc.net/problem/14950

 

14950번: 정복자

서강 나라는 N개의 도시와 M개의 도로로 이루어졌다. 모든 도시의 쌍에는 그 도시를 연결하는 도로로 구성된 경로가 있다. 각 도로는 양방향 도로이며, 각 도로는 사용하는데 필요한 비용이 존재

www.acmicpc.net

 

 

 

알고리즘 종류

    - MST

    - Prim

 

 

 

사고 과정

    - 모든 노드를 최소 비용으로 연결하는 MST 문제이다. 그런데 간선 기준이 아닌 노드 기준으로 탐색되고 있다. 따라서 Prim 알고리즘을 사용한다.

 

 

 

구현(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
#include <iostream>
#include <vector>
#include <queue>
 
using namespace std;
 
int n, m, t;
int answer=0;
 
int isVisited[10001];
vector<vector<pair<intint> > > edges;
priority_queue<pair<intint> > pq;
 
 
void prim(int here, int cnt){
    
    isVisited[here] = 1;
    
    // 시작 노드에서 연결된 간선들 중에 가장 비용이 적은 간선 뽑을 준비  
    for(int i=0; i<edges[here].size(); i++){
        int next = edges[here][i].first;
        int cost = edges[here][i].second;
        
        if(isVisited[next]==0) pq.push({-cost, next});
    }
    
    // 비용이 가장 적은 간선 뽑아서 연결하기  
    while(!pq.empty()){
        int next = pq.top().second;
        int cost = -pq.top().first;
        pq.pop();
        
        if(isVisited[next]) continue;
        answer+= cost + cnt*t;
        prim(next, cnt+1);
        return;
    }
}
 
 
int main(void){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n >> m >> t;
    edges.resize(n+1);
    
    int a,b,c;
    for(int i=0; i<m; i++){
        cin >> a >> b >> c;
        edges[a].push_back({b,c});
        edges[b].push_back({a,c});
    }
    
    prim(10);
    cout << answer << endl;
}
cs

 

 

 

시행착오

반응형