MST 문제다. 크루스칼 알고리즘을 사용했다.
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 | #include <stdio.h> #pragma warning(disable:4996) typedef long long ll; int n, m; struct edge { int u, v, w; edge(int u = 0, int v = 0, int w = 0) : u(u), v(v), w(w) {} }; edge arr[100001]; void _sort(int l, int r) { if (l == r || r - 1 == l) return; int mid = (l + r) / 2; _sort(l, mid); _sort(mid, r); edge *temp = new edge[r - l]; int cur = 0, l_cur = l, r_cur = mid; while (l_cur < mid && r_cur < r) { if (arr[l_cur].w < arr[r_cur].w) { temp[cur++] = arr[l_cur++]; } else temp[cur++] = arr[r_cur++]; } for (; l_cur < mid; l_cur++) temp[cur++] = arr[l_cur]; for (; r_cur < r; r_cur++) temp[cur++] = arr[r_cur]; for (int i = 0; i < r - l; i++) arr[l + i] = temp[i]; } int d[1001]; int f(int x) { return x == d[x] ? x : d[x] = f(d[x]); } void u(int x, int y){ x = f(x); y = f(y); if (x != y) d[y] = x; } int main() { for (int i = 0; i < 1001; i++) d[i] = i; scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); arr[i] = { a, b, c }; } _sort(0, m); ll ans = 0; for (int i = 0; i < m; i++) { if (f(arr[i].u) != f(arr[i].v)) { u(arr[i].u, arr[i].v); ans += arr[i].w; } } printf("%lld", ans); return 0; } | cs |
'BOJ' 카테고리의 다른 글
6497 전력난 (0) | 2018.04.04 |
---|---|
1647 도시 분할 계획 (0) | 2018.04.04 |
10840 구간성분 (0) | 2018.04.04 |
6324 URLs (0) | 2018.04.04 |
2257 화학식량 (0) | 2018.04.04 |