※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 16398번 문제인 행성 연결이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/16398 

 

16398번: 행성 연결

홍익 제국의 중심은 행성 T이다. 제국의 황제 윤석이는 행성 T에서 제국을 효과적으로 통치하기 위해서, N개의 행성 간에 플로우를 설치하려고 한다. 두 행성 간에 플로우를 설치하면 제국의 함

www.acmicpc.net

주어진 N개의 행성을 노드로, 각 두 행성의 쌍을 해당 행성들 사이에 플로우를 설치했을 때의 유지비용을 가중치로 하는 에지로 생각해 문제의 상황을 그래프로 모델링할 수 있다. 이 때 주어진 문제는 위 그래프의 최소 신장 트리(Minimum spanning tree)의 가중치를 구하는 문제로 생각할 수 있다.

 

글쓴이는 크루스칼 알고리즘(Kruskal's algoroithm)을 이용해 최소 신장 트리의 가중치를 구해 문제를 해결하였다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;

int N;
int uf[1001];

int findf(int x) {
	if (uf[x] == x) return x;
	return uf[x] = findf(uf[x]);
}

ll ans;
priority_queue<pair<int, pair<int, int>>> pq;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;
	for (int i = 1; i <= N; i++) uf[i] = i;

	for (int r = 1; r <= N; r++) {
		for (int c = 1; c <= N; c++) {
			int x; cin >> x;
			if (r < c) pq.push(make_pair(-x, make_pair(r, c)));
		}
	}

	while (!pq.empty()) {
		int val = -pq.top().first, x = pq.top().second.first, y = pq.top().second.second; pq.pop();
		
		x = findf(x), y = findf(y);
		if (x == y) continue;
		ans += val, uf[y] = x;
	}

	cout << ans;
}
728x90

+ Recent posts