반응형
https://www.acmicpc.net/problem/11085
11085번: 군사 이동
전쟁 당시 Baekjoon World의 국왕은 Cube World를 공격할 작전을 세운 적이 있습니다. Baekjoon World와 Cube World는 p개의 지점과 w개의 길로 표현됩니다. 모든 길은 양방향이며, 각 길마다 너비가 존재하여
www.acmicpc.net
[ 문제풀이 ]
1. vect[ p ] 배열을 만들어 각 지점의 부모 노드를 저장합니다.
2. Union-Find를 이용하여 각 지점을 잇고, 이은 길 중 가장 좁은 길을 ans에 저장합니다.
3. 지점을 이을 때마다 두 수도가 이어져 있는지 체크하고, 이어져 있다면 ans를 출력합니다.
[ 소스코드 ]
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 | #include<iostream> #include<algorithm> using namespace std; struct node { int start; int end; int width; }; bool cmp(node left, node right) { return left.width > right.width; } int p, w, c, v; node arr[50000]; int vect[1000]; 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() { scanf("%d %d %d %d", &p, &w, &c, &v); for (int i = 1; i < p; i++) { vect[i] = i; } for (int i = 0; i < w; i++) { int s, e, w; scanf("%d %d %d", &s, &e, &w); arr[i] = { s,e,w }; } sort(arr, arr + w, cmp); int ans = 1000; for (int i = 0; i < w; i++) { const int a = arr[i].start; const int b = arr[i].end; const int width = arr[i].width; if (Find(a) != Find(b)) { Union(a, b); ans = min(ans, width); if (Find(c) == Find(v)) { printf("%d", ans); return 0; } } } } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 1937번 - 욕심쟁이 판다 (C++) (0) | 2023.02.15 |
---|---|
[ 백준 ] 7570번 - 줄 세우기 (C++) (0) | 2023.02.14 |
[ 백준 ] 2565번 - 전깃줄 (C++) (0) | 2023.02.12 |
[ 백준 ] 17836번 - 공주님을 구해라! (C++) (0) | 2023.02.11 |
[ 백준 ] 15971번 - 두 로봇 (C++) (0) | 2023.02.10 |