링크 (https://www.acmicpc.net/problem/16398)
16398번: 행성 연결
홍익 제국의 중심은 행성 T이다. 제국의 황제 윤석이는 행성 T에서 제국을 효과적으로 통치하기 위해서, N개의 행성 간에 플로우를 설치하려고 한다. 두 행성 간에 플로우를 설치하면 제국의 함
www.acmicpc.net
무난한 최소 스패닝 트리 문제이다. MST 문제를 항상 크루스칼 알고리즘으로만 풀었는데 이번엔 프림 알고리즘으로 풀어봤다!
정답이 int 범위보다 클 수 있으므로 long long으로 해주어야 한다.
[소스코드]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
BOJ 16398번: 행성 연결 | |
DATE: 2022-03-02 | |
Prim Algorithm | |
*/ | |
#include <iostream> | |
#include <vector> | |
#include <queue> | |
#define MAX 1001 | |
#define pii pair<int,int> | |
using namespace std; | |
vector<pii> edge[MAX]; | |
bool visited[MAX]; | |
long long prim(){ | |
long long ans = 0; | |
priority_queue<pii, vector<pii>, greater<pii>> pq; | |
pq.push({0, 1}); | |
while(!pq.empty()){ | |
int dis = pq.top().first; | |
int cur = pq.top().second; | |
pq.pop(); | |
if(visited[cur]) continue; | |
visited[cur] = true; | |
ans += dis; | |
for(int i = 0 ; i < edge[cur].size() ; i++){ | |
if(!visited[edge[cur][i].second]) pq.push(edge[cur][i]); | |
} | |
} | |
return ans; | |
} | |
int main(){ | |
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); | |
int n, num; | |
cin >> n; | |
for(int i = 1 ; i <= n ; i++){ | |
for(int j = 1 ; j <= n ; j++){ | |
cin >> num; | |
if(i == j) continue; | |
edge[i].push_back({num, j}); | |
} | |
} | |
cout << prim(); | |
return 0; | |
} |

'ALGORITHM > BOJ' 카테고리의 다른 글
[BOJ] 14621번 나만 안되는 연애 (C++) (0) | 2022.03.03 |
---|---|
[BOJ] 1253번 좋다 (C++) (0) | 2022.01.19 |
[BOJ] 3078번 좋은 친구 (C++) (0) | 2022.01.19 |
[BOJ] 2096번 내려가기 (C++) (0) | 2022.01.19 |
[BOJ] 2211번 네트워크 복구 (C++) (0) | 2022.01.17 |