반응형
https://www.acmicpc.net/problem/16202
16202번: MST 게임
첫 턴에 찾을 수 있는 MST는 총 5개의 간선 {(1, 3), (1, 2), (2, 4), (4, 6), (4, 5)}로 이루어져 있고, 비용은 16이다. 두 번째 턴에는 첫 턴에서 구한 MST에서 간선의 비용이 최소인 (2, 4)를 제거한 후 남아있
www.acmicpc.net
[ 문제풀이 ]
1. 모든 간선을 입력받고 arr 배열에 저장합니다.
2. 총 K번 for문을 돌면서 MST를 만들고, 그중 가장 짧은 간선을 제거하면서 MST의 길이를 출력해 줍니다.
3. 만약 MST를 만들 수 없다면 0을 출력하고, 이후 턴에서 모두 0을 출력합니다.
[ 소스코드 ]
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 | #include<iostream> using namespace std; int N, M, K; pair<int, int> arr[10001]; int vect[1001]; int Min = 1; bool zero = false; 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", &N, &M, &K); for (int i = 1; i <= M; i++) { scanf("%d %d", &arr[i].first, &arr[i].second); } for (int k = 0; k < K; k++) { int ans = 0; int temp = 987654321; if (zero) { printf("0 "); continue; } for (int i = 1; i <= N; i++) { vect[i] = i; } for (int i = Min; i <= M; i++) { const int a = arr[i].first; const int b = arr[i].second; if (Find(a) != Find(b)) { Union(a, b); ans += i; temp = min(temp, i); } } Min = temp + 1; for (int i = 2; i <= N; i++) { if (Find(1) != Find(i)) { printf("0 "); zero = true; break; } } if (zero != true) { printf("%d ", ans); } } } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 1068번 - 트리 (C++) (0) | 2023.03.09 |
---|---|
[ 백준 ] 27009번 - Out of Hay (C++) (0) | 2023.03.08 |
[ 백준 ] 21924번 - 도시 건설 (C++) (0) | 2023.03.06 |
[ 백준 ] 13905번 - 세부 (C++) (0) | 2023.03.05 |
[ 백준 ] 5972번 - 택배 배송 (C++) (0) | 2023.03.04 |