Advertisement
Dmaxiya

克鲁斯卡尔 模板代码

Mar 5th, 2025
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.39 KB | None | 0 0
  1. const int maxn = 100000 + 100;
  2. struct Edge {
  3.     int u, v, dis;
  4. };
  5.  
  6. // 重载 Edge 的小于操作符
  7. // 与排序相关的函数、模板类有用
  8. // 如 sort 函数中,若 (a < b) == true 则 a 会被排在 b 前面
  9. // 如 set、map 的 key、priority_queue 等需要进行排序的模板类,当 (a < b) == true 时,就会按照 a < b 的规则对 Edge 的两个对象进行排序
  10. // const Edge & 为 Edge 的 const 引用,const 用来限制在比较时不允许修改数据,引用用于加快形参传递
  11. bool operator<(const Edge &a, const Edge &b) {
  12.     return a.dis < b.dis;
  13. }
  14.  
  15. int n, m;           // n 个节点 m 条边
  16. int fa[maxn];       // 并查集数组
  17. Edge edge[maxn];    // 边数组
  18.  
  19. // 以下为并查集模板代码
  20. void init() {
  21.     for (int i = 1; i <= n; ++i) {
  22.         fa[i] = i;
  23.     }
  24. }
  25.  
  26. int Find(int x) {
  27.     return x == fa[x] ? x : fa[x] = Find(fa[x]);
  28. }
  29.  
  30. void union_(int x, int y) {
  31.     fa[Find(x)] = Find(y);
  32. }
  33. // 以上为并查集模板代码
  34.  
  35. void kruskal() {
  36.     init();
  37.     // 排序时会调用上面重载的小于运算符规则
  38.     sort(edge, edge + m);
  39.     for (int i = 0; i < m; ++i) {
  40.         // 如果 u 与 v 不在一个连通块内,就取这条边作为最小生成树的边,并将 u, v 合并到同一个连通块
  41.         if (Find(edge[i].u) != Find(edge[i].v)) {
  42.             union_(edge[i].u, edge[i].v);
  43.         }
  44.     }
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement