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

 

이번에 볼 문제는 백준 13905번 문제인 세부이다.
문제는 아래 링크를 확인하자.

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

 

13905번: 세부

첫 번째 줄에는 섬에 존재하는 집의 수 N(2≤N≤100,000)와 다리의 수 M(1≤M≤300,000)이 주어진다. 두 번째 줄에는 숭이의 출발 위치(s)와 혜빈이의 위치(e)가 주어진다. (1≤s, e≤N, s≠e). 다음 M개의 줄

www.acmicpc.net

가장 무게제한이 큰 다리부터 하나씩 차례대로 이용하여 섬들을 이어나가면서, 처음으로 s와 e가 연결되는 순간에 연결한 다리의 가중치를 출력하는 것으로 문제를 해결할 수 있다. 이것이 성립하는 이유는 최소 스패닝 트리(MST)를 탐색하는 크루스칼 알고리즘(Kruskal's algorithm)의 정당성 증명과정을 떠올리면 쉽게 이해할 수 있다.

 

모든 다리를 연결시켜도 s와 e가 연결되어있지 않다면 s에서 e로 이동할 수 없으므로 0을 출력해주자.

 

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

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int N, M, S, E;
int uf[100001];

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

pair<int, pair<int, int>> edge[300000];

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

	cin >> N >> M >> S >> E;
	for (int i = 0; i < M; i++) {
		auto& e = edge[i];
		cin >> e.second.first >> e.second.second >> e.first;
	}

	sort(edge, edge + M);

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

	for (int i = M - 1; i > -1; i--) {
		auto& e = edge[i];
		int x = e.second.first, y = e.second.second;
		x = findf(x), y = findf(y);
		uf[y] = x;

		if (findf(S) == findf(E)) {
			cout << e.first;
			return 0;
		}
	}

	cout << 0;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 13915 // C++] 현수의 열기구 교실  (0) 2023.03.31
[BOJ 13906 // C++] 대문자  (0) 2023.03.30
[BOJ 13902 // C++] 개업 2  (0) 2023.03.28
[BOJ 13901 // C++] 로봇  (0) 2023.03.27
[BOJ 13912 // C++] 외계 생물  (0) 2023.03.26

+ Recent posts