반응형
문제 출처 :
https://www.acmicpc.net/problem/14950
알고리즘 분석 :
문제 해결에 필요한 사항
1. 최소 스패닝 트리
이 문제는 1번 정점부터 시작이라 했으니 프림 알고리즘으로 다가가도 되지만
결국 최소 스패닝 트리를 이룰 때 1번정점과 다른 정점의 최소 간선을 이어주기에 크루스칼을 이용해도 무방하다.
소스 코드 :
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> #include <cstdio> #include <algorithm> #include <vector> using namespace std; typedef struct _KS_ { int from; int to; int val; }KS; vector<KS> edge; int chk[10002]; int ret; bool comp(KS a, KS b) { return a.val < b.val; } int find(int num) { if (num == chk[num]) return num; return chk[num] = find(chk[num]); } int main() { int n, m, t; scanf("%d %d %d", &n, &m, &t); for (int i = 1; i <= n; i++) chk[i] = i; for (int i = 0; i < m; i++) { KS ks; scanf("%d %d %d", &ks.from, &ks.to, &ks.val); edge.push_back(ks); } sort(edge.begin(), edge.end(), comp); int cnt = 0; for (int i = 0; i < m; i++) { int nv = find(edge[i].from); int nw = find(edge[i].to); if (nv == nw) continue; chk[nv] = nw; ret += edge[i].val + t * (cnt++); } cout << ret; return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[15501번] 부당한 퍼즐 (2) | 2018.03.05 |
---|---|
[11000번] 강의실 배정 (0) | 2018.02.24 |
[11811번] 데스스타 (0) | 2018.02.22 |
[1205번] 등수 구하기 (2) | 2018.02.22 |
[11400번] 단절선 (0) | 2018.02.22 |