首页 > 其他分享 >Kruskal

Kruskal

时间:2024-08-03 21:51:51浏览次数:12  
标签:src parent weight int Kruskal nextEdge dest

Kruskal

Kruskal 算法是一种基于贪心策略的最小生成树算法,它通过逐步选择权重最小的边,并确保该边不会形成环路来构建最小生成树。

算法流程如下:

  1. 创建一个空的最小生成树 MST 和一个空的集合 visited,用于存放已经访问过的顶点。
  2. 将图中的所有边按照权重从小到大进行排序。
  3. 遍历排序后的边,对于每条边 (u, v):
    • 如果加入边 (u, v) 后不会形成环路,则将该边加入 MST,并将顶点 u 和顶点 v 加入 visited 集合中。
    • 如果加入边 (u, v) 后形成环路,则忽略该边。
  4. 重复步骤 3,直到 MST 中包含 n-1 条边,最终得到的 MST 就是最小生成树。

java 模板如下:

static class Edge implements Comparable<Edge> {
 int src, dest, weight;
 public Edge(int src, int dest, int weight){
  this.src = src;
  this.dest = dest;
  this.weight = weight;
 }
 public int compareTo(Edge edge) {
  return this.weight - edge.weight;
 }
}
static int[][] kruskalMST(Edge[] edges, int V) {
 int[][] mst = new int[V][V]; // 最小生成树
 int E = edges.length; // 边数
 Arrays.sort(edges);
 
 // 使用并查集判断是否存在回路
 int[] parent = init(V);
 
 int edgeCount = 0; // 记录加入最小生成树的边数
 int index = 0; // 边数组的索引
 // 构建最小生成树
 while (edgeCount < V - 1 && index < E) {
  Edge nextEdge = edges[index++];
  int x = find(parent, nextEdge.src);
  int y = find(parent, nextEdge.dest);
  if (x != y) {
   mst[nextEdge.src][nextEdge.dest] = nextEdge.weight;
   mst[nextEdge.dest][nextEdge.src] = nextEdge.weight;
   edgeCount++;
   union(parent, x, y);
  }
 }
 return mst;
}

// 并查集
static int[] init(int n){
 int[] parent = new int[n]; // 用于判断是否形成环路
 for (int i = 0; i < n; i++) {
  parent[i] = i;
 }
 return parent;
}
static int find(int[] parent, int i) {
 if (parent[i] != i) {
  parent[i] = find(parent, parent[i]);
 }
 return parent[i];
}
static void union(int[] parent, int x, int y) {
 int xroot = find(parent, x);
 int yroot = find(parent, y);
 parent[yroot] = xroot;
}

标签:src,parent,weight,int,Kruskal,nextEdge,dest
From: https://www.cnblogs.com/licwuu/p/18341154

相关文章

  • 山东大学数据结构与算法实验13最小生成树(Prim算法/Kruskal算法)
    A : Prim算法题目描述使用prim算法实现最小生成树输入输出格式输入第一行两个整数n,e。n(1≤n≤200000)代表图中点的个数,e(0≤m≤500000)代表边的个数。接下来e行,每行代表一条边:ijw 表示顶点i和顶点j之间有一条权重为w的边输出最小生成树所有边的......
  • 致敬传奇 Kruskal 重构树题硬控我三小时
    NOI2018归程存边的数组拿来干两件事,忘了清空了,其实最好开两个的dfs没开vis导致不知道为什么出现的绕圈倍增的fa[i][j]定义的时候前面是\(2^{i}\)写着写着记错成后面了忘记要递减排序了,跑的最小生成树并查集没初始化不知道为什么,倍增的fa数组单独一块处理会WA,回......
  • kruskal重构树
    比较好理解,相当于重建了一个二叉树,所有的父亲节点都为原来图中的边,儿子节点为点。重构树就可以利用lca求两点间的最大(或者最小)边权以及一些树上操作。较为简单的应用,需要用线段树来维护信息。点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=1e6;i......
  • Kruskal 重构树学习笔记
    Kruskal想必大家都不陌生,这是一种求最小生成树的算法。关于Kruskal重构树,就是把一张图转化为一个堆。具体来说,我们可以处理出来从\(u\)到\(v\)路径中的点权或边权的极值。比如上面这张图(前为编号,[]内为点权),我们可以将它重构为小顶堆,如下请注意,这棵树有着严格的方向,......
  • 最小生成树(Kruskal和Prim算法)
    最小生成树(Kruskal和Prim算法)部分资料来源于:最小生成树(Kruskal算法)_kruskal算法求最小生成树-CSDN博客、【算法】最小生成树——Prim和Kruskal算法-CSDN博客关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。强连通图:在有向......
  • 代码随想录算法训练营第六十三天 | prim算法、kruskal算法、复习
    53.寻宝—prim算法题目链接:https://kamacoder.com/problempage.php?pid=1053文档讲解:https://programmercarl.com/kamacoder/0053.%E5%AF%BB%E5%AE%9D-prim.html思路本题是最小生成树的模板题,最小生成树可以使用prim算法,也可以使用kruskal算法计算出来。prim算......
  • 【数据结构与算法】最小生成树,Prim算法,Kruskal算法 详解
    最小生成树的实际应用背景。最节省经费的前提下,在n个城市之间建立通信联络网。Kruskal算法(基于并查集)voidinit(){for(inti=1;i<=n;i++){pre[i]=i;}}llroot(lla){lli=a;while(pre[i]!=i){i=pre[i];......
  • 算法课程笔记——Kruskal & Prim
    算法课程笔记——Kruskal&Prim......
  • C语言Kruskal算法求最小生成树
    Kruskal算法求出最小生成树。图形算法描述先找最小权值边为1的边有(V1,V4),(V2,V9),保证不产生回路就可以成功选择边除去上一次找的边后,在找权值最小的边为2的有(V2,V3),(V4,V3),(V5,V6),(V9,V8),连接不产生回路的边除去之前找过的边,后面再看权值最小的边为3的边有(V1,V3),(V7,V8),(V9,V7)按顺......
  • Kruskal最小生成树
    Kruskal最小生成树Kruskal最小生成树是求解图G的最小生成树(最优树)T的算法。Kruskal算法是基于边来构造的算法,相对好理解。还有一个Prim算法是从点方面考虑的构建方式。对于图\(G(V,E)\),Kruskal算法的时间复杂度是\(O(|E|\cdot\alpha(V))\),其中α为Ackermann函数,其增长非......