문제 (https://www.acmicpc.net/problem/1939)
1939번: 중량제한
첫째 줄에 N, M(1 ≤ M ≤ 100,000)이 주어진다. 다음 M개의 줄에는 다리에 대한 정보를 나타내는 세 정수 A, B(1 ≤ A, B ≤ N), C(1 ≤ C ≤ 1,000,000,000)가 주어진다. 이는 A번 섬과 B번 섬 사이에 중량제한이
www.acmicpc.net
이번 스터디 주제인 이분탐색으로 해결하려고 했으나 도저히 모르겠어서 크루스칼로 해결했다 🤯
중량의 최댓값을 구해야 하는 문제이므로 입력을 받은 후 간선의 크기를 기준으로 내림차순 정렬했다. 노드들을 합쳐가면서 매번 마지막 입력으로 들어온 두 섬이 연결되었는지 확인해야 한다. 연결이 되었다면, 연결된 모든 노드들 간의 간선들 중 가장 작은 값이 정답이 된다.
가장 작은 값이 정답인 이유는 중량제한을 초과하는 양의 물품이 다리를 지나게 되면 다리가 무너지게 되기 때문이다. 따라서 생성된 두 섬 사이의 경로들 중 가장 작은 값이 중량의 최댓값이 되는 것이다!
[소스코드]
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 1939번: 중량제한 | |
2022-01-03 | |
Kruskal Algorithm | |
*/ | |
#include <iostream> | |
#include <vector> | |
#include <algorithm> | |
#include <queue> | |
#define MAX 10001 | |
#define INF 1000000000 | |
using namespace std; | |
vector<pair<int, pair<int,int>>> edge; | |
int parent[MAX]; | |
int getParent(int x) { | |
if(parent[x] == x) return x; | |
return parent[x] = getParent(parent[x]); | |
} | |
void unionParent(int a, int b) { | |
a = getParent(a); | |
b = getParent(b); | |
if(a < b) parent[b] = a; | |
else parent[a] = b; | |
} | |
int findParent(int a, int b){ | |
a = getParent(a); | |
b = getParent(b); | |
if(a == b) return true; | |
else return false; | |
} | |
int main(){ | |
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); | |
vector<int> weight; | |
int n, m; | |
int a, b, c; | |
int start, end; | |
cin >> n >> m; | |
for(int i = 1 ; i <= n ; i++) parent[i] = i; | |
for(int i = 0 ; i < m ; i++) { | |
cin >> a >> b >> c; | |
edge.push_back({c, {a, b}}); | |
edge.push_back({c, {b, a}}); | |
} | |
cin >> start >> end; | |
sort(edge.begin(), edge.end(), greater<>()); | |
for(int i = 0 ; i < edge.size() ; i++) { | |
int a = edge[i].second.first; | |
int b = edge[i].second.second; | |
int c = edge[i].first; | |
if(findParent(a, b)) continue; | |
unionParent(a, b); | |
weight.push_back(c); | |
if(findParent(start, end)) { | |
cout << *min_element(weight.begin(), weight.end()); | |
break; | |
} | |
} | |
return 0; | |
} |

'ALGORITHM > BOJ' 카테고리의 다른 글
[BOJ] 1238번 파티 (C++) (0) | 2022.01.17 |
---|---|
[BOJ] 2887번 행성 터널 (C++) (0) | 2022.01.05 |
[BOJ] 3020번 개똥벌레 (C++) (0) | 2022.01.05 |
[BOJ] 4386번 별자리 만들기 (C++) (0) | 2022.01.04 |
[BOJ] 11779번 최소비용 구하기 2 (C++) (0) | 2022.01.04 |