※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1939번 문제인 중량제한이다.
문제는 아래 링크를 확인하자.
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번 섬 사이에 중량제한이 C인 다리
www.acmicpc.net
글쓴이는 가장 많은 중량을 버틸 수 있는 다리부터 순서대로 다리를 놓아나가다가 두 공장이 같은 component에 있는 때가 오면 그때 놓은 다리가 버틸 수 있는 중량을 출력하는 것으로 문제를 해결했다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int uf[10001];
int findf(int x) {
if (x == uf[x]) return x;
return uf[x] = findf(uf[x]);
}
vector<pair<int, pair<int, int>>> edges;
bool comp(pair<int, pair<int, int>> p1, pair<int, pair<int, int>> p2) {
return p1 > p2;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, M; cin >> N >> M;
for (int i = 1; i <= N; i++) uf[i] = i;
for (int i = 0; i < M; i++) {
int x, y, w; cin >> x >> y >> w;
edges.push_back({ w,{x,y} });
}
sort(edges.begin(), edges.end(), comp);
int A, B; cin >> A >> B;
for (auto edge : edges) {
int x = findf(edge.second.first), y = findf(edge.second.second);
if (x == y) continue;
uf[y] = x;
if (findf(A) == findf(B)) {
cout << edge.first;
return 0;
}
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1256 // C++] 사전 (0) | 2021.08.08 |
---|---|
[BOJ 13140 // C++] Hello World! (0) | 2021.08.07 |
[BOJ 15918 // C++] 랭퍼든 수열쟁이야!! (0) | 2021.08.05 |
[BOJ 15916 // C++] 가희는 그래플러야!! (0) | 2021.08.04 |
[BOJ 11378 // C++] 열혈강호 4 (0) | 2021.08.03 |