반응형
알고리즘 종류
- 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<int, int> > > edges; priority_queue<pair<int, int> > 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(1, 0); cout << answer << endl; } | cs |
시행착오
반응형
'코딩 공부 > 백준' 카테고리의 다른 글
[백준][C++] 1715 카드 정렬하기 (0) | 2021.03.29 |
---|---|
[백준][C++] 1400 화물차 (0) | 2021.03.27 |
[백준][C++] 2307 도로검문 (0) | 2021.03.27 |
[백준][C++] 16137 견우와 직녀 (0) | 2021.03.27 |
[백준][C++] 16954 움직이는 미로 탈출 (0) | 2021.03.26 |