/* 最小生成树 之 CODE[VS] 1231 最优布线问题 Kruskal算法(邻接表) */
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstddef> 5 #include <iterator> 6 #include <algorithm> 7 #include <string> 8 #include <locale> 9 #include <cmath> 10 #include <vector> 11 #include <cstring> 12 #include <map> 13 #include <utility> 14 #include <queue> 15 #include <stack> 16 #include <set> 17 #include <functional> 18 using namespace std; 19 typedef pair<int, int> PII; 20 typedef long long int64; 21 const int INF = 0x3f3f3f3f; 22 const int modPrime = 3046721; 23 const double eps = 1e-9; 24 const int MaxN = 100010; 25 const int MaxM = 100010; 26 27 28 29 /***************************************************/ 30 /*Union-find sets*/ 31 int ftr[MaxN]; 32 int rnk[MaxN]; 33 34 void ufsIni(int n) 35 { 36 for (int i = 0; i <= n; ++i) 37 { 38 ftr[i] = i; 39 rnk[i] = 0; 40 } 41 } 42 43 int ufsFind(int x) 44 { 45 if (x == ftr[x]) return x; 46 return ftr[x] = ufsFind(ftr[x]); 47 } 48 49 void ufsUnion(int x, int y) 50 { 51 x = ufsFind(x); 52 y = ufsFind(y); 53 if (x == y) return; 54 55 if (rnk[x] < rnk[y]) 56 { 57 ftr[x] = y; 58 } 59 else 60 { 61 ftr[y] = x; 62 if (rnk[x] == rnk[y]) 63 { 64 ++rnk[x]; 65 } 66 } 67 } 68 69 bool ufsSame(int x, int y) 70 { 71 return (ufsFind(x) == ufsFind(y)); 72 } 73 74 /***************************************************/ 75 76 int N, M; 77 struct Edge 78 { 79 int u, v, cost; 80 }; 81 82 bool Cmp(const Edge e1, const Edge e2) 83 { 84 return e1.cost < e2.cost; 85 } 86 Edge edge[MaxM]; 87 88 89 void Solve() 90 { 91 ufsIni(N); 92 sort(edge, edge + M, Cmp); 93 int64 ans = 0; 94 for (int i = 0; i < M; ++i) 95 { 96 Edge eg = edge[i]; 97 if (!ufsSame(eg.u, eg.v)) 98 { 99 ufsUnion(eg.u, eg.v); 100 ans += eg.cost; 101 } 102 } 103 printf("%lld\n", ans); 104 } 105 106 int main() 107 { 108 #ifdef HOME 109 freopen("in", "r", stdin); 110 //freopen("out", "w", stdout); 111 #endif 112 113 scanf("%d %d", &N, &M); 114 for (int i = 0; i < M; ++i) 115 { 116 scanf("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].cost); 117 } 118 119 Solve(); 120 121 #ifdef HOME 122 cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl; 123 _CrtDumpMemoryLeaks(); 124 #endif 125 return 0; 126 }
时间: 2024-10-20 00:11:04