반응형
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
[ 문제풀이 ]
1. 부모 노드를 저장할 vect 배열을 선언하고, vect[ i ] = i로 초기화합니다.
2. arr 배열을 거리를 기준으로 내림차순으로 정렬합니다.
3. Union-Find를 이용하여 각 지점들을 연결하고, 각 공장 사이에 길이 완성되었다면 연결된 순간의 다리의 길이를 출력합니다.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include<iostream> #include<algorithm> using namespace std; struct node { int A, B, C; }; bool cmp(node left, node right) { return left.C > right.C; } int N, M; node arr[100000]; int vect[10001]; int Find(int num) { if (vect[num] == num) return num; return vect[num] = Find(vect[num]); } void Union(int A, int B) { int pA = Find(A); int pB = Find(B); vect[pB] = pA; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N >> M; for (int i = 1; i <= N; i++) { vect[i] = i; } for (int i = 0; i < M; i++) { int A, B, C; cin >> A >> B >> C; arr[i] = { A,B,C }; } int s, e; cin >> s >> e; sort(arr, arr + M, cmp); for (int i = 0; i < M; i++) { const int A = arr[i].A; const int B = arr[i].B; const int C = arr[i].C; if (Find(A) != Find(B)) { Union(A, B); } if (Find(s) == Find(e)) { cout << C; return 0; } } } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 2610번 - 회의준비 (C++) (0) | 2023.08.30 |
---|---|
[ 백준 ] 28421번 - 곱하기와 쿼리 (C++) (0) | 2023.08.29 |
[ 백준 ] 11058번 - 크리보드 (C++) (0) | 2023.08.27 |
[ 백준 ] 2758번 - 로또 (C++) (0) | 2023.08.26 |
[ 백준 ] 2580번 - 스도쿠 (C++) (0) | 2023.08.25 |