1+ #include < bits/stdc++.h>
2+
3+ using namespace std ;
4+
5+ // 노드의 개수와 간선(Union 연산)의 개수 입력받기
6+ int v, e;
7+ int parent[100001 ]; // 부모 테이블 초기화
8+ // 모든 간선을 담을 리스트와, 최종 비용을 담을 변수
9+ vector<pair<int , pair<int , int > > > edges;
10+ int result = 0 ;
11+
12+ // 특정 원소가 속한 집합을 찾기
13+ int findParent (int x) {
14+ // 루트 노드가 아니라면, 루트 노드를 찾을 때까지 재귀적으로 호출
15+ if (x == parent[x]) return x;
16+ return parent[x] = findParent (parent[x]);
17+ }
18+
19+ // 두 원소가 속한 집합을 합치기
20+ void unionParent (int a, int b) {
21+ a = findParent (a);
22+ b = findParent (b);
23+ if (a < b) parent[b] = a;
24+ else parent[a] = b;
25+ }
26+
27+ int main (void ) {
28+ cin >> v >> e;
29+
30+ // 부모 테이블상에서, 부모를 자기 자신으로 초기화
31+ for (int i = 1 ; i <= v; i++) {
32+ parent[i] = i;
33+ }
34+
35+ // 모든 간선에 대한 정보를 입력 받기
36+ for (int i = 0 ; i < e; i++) {
37+ int a, b, cost;
38+ cin >> a >> b >> cost;
39+ // 비용순으로 정렬하기 위해서 튜플의 첫 번째 원소를 비용으로 설정
40+ edges.push_back ({cost, {a, b}});
41+ }
42+
43+ // 간선을 비용순으로 정렬
44+ sort (edges.begin (), edges.end ());
45+ int last = 0 ; // 최소 신장 트리에 포함되는 간선 중에서 가장 비용이 큰 간선
46+
47+ // 간선을 하나씩 확인하며
48+ for (int i = 0 ; i < edges.size (); i++) {
49+ int cost = edges[i].first ;
50+ int a = edges[i].second .first ;
51+ int b = edges[i].second .second ;
52+ // 사이클이 발생하지 않는 경우에만 집합에 포함
53+ if (findParent (a) != findParent (b)) {
54+ unionParent (a, b);
55+ result += cost;
56+ last = cost;
57+ }
58+ }
59+
60+ cout << result - last << ' \n ' ;
61+ }
0 commit comments