Advertisement
Dmaxiya

P3366 【模板】最小生成树 参考代码

Mar 5th, 2025
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long LL;
  5. const int maxn = 200000 + 100;
  6. struct Edge {
  7.     int u, v, dis;
  8. };
  9.  
  10. // 重载 Edge 的小于操作符
  11. // 与排序相关的函数、模板类有用
  12. // 如 sort 函数中,若 (a < b) == true 则 a 会被排在 b 前面
  13. // 如 set、map 的 key、priority_queue 等需要进行排序的模板类,当 (a < b) == true 时,就会按照 a < b 的规则对 Edge 的两个对象进行排序
  14. // const Edge & 为 Edge 的 const 引用,const 用来限制在比较时不允许修改数据,引用用于加快形参传递
  15. bool operator<(const Edge &a, const Edge &b) {
  16.     return a.dis < b.dis;
  17. }
  18.  
  19. int n, m, cnt;           // n 个节点 m 条边
  20. int ans;
  21. int fa[maxn];       // 并查集数组
  22. Edge edge[maxn];    // 边数组
  23.  
  24. // 以下为并查集模板代码
  25. void init() {
  26.     for (int i = 1; i <= n; ++i) {
  27.         fa[i] = i;
  28.     }
  29. }
  30.  
  31. int Find(int x) {
  32.     return x == fa[x] ? x : fa[x] = Find(fa[x]);
  33. }
  34.  
  35. void union_(int x, int y) {
  36.     fa[Find(x)] = Find(y);
  37. }
  38. // 以上为并查集模板代码
  39.  
  40. void kruskal() {
  41.     init();
  42.     // 排序时会调用上面重载的小于运算符规则
  43.     sort(edge, edge + m);
  44.     for (int i = 0; i < m; ++i) {
  45.         // 如果 u 与 v 不在一个连通块内,就取这条边作为最小生成树的边,并将 u, v 合并到同一个连通块
  46.         if (Find(edge[i].u) != Find(edge[i].v)) {
  47.             union_(edge[i].u, edge[i].v);
  48.             ans += edge[i].dis;
  49.             --cnt;
  50.         }
  51.     }
  52. }
  53.  
  54. int main() {
  55. #ifdef ExRoc
  56.     freopen("test.txt", "r", stdin);
  57. #endif // ExRoc
  58.     ios::sync_with_stdio(false);
  59.  
  60.     cin >> n >> m;
  61.     cnt = n;
  62.     for (int i = 0; i < m; ++i) {
  63.         cin >> edge[i].u >> edge[i].v >> edge[i].dis;
  64.     }
  65.     kruskal();
  66.     if (cnt == 1) {
  67.         cout << ans << endl;
  68.         return 0;
  69.     }
  70.     cout << "orz" << endl;
  71.  
  72.     return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement