并查集在kruskal算法中应用
来源:互联网 发布:windows 数据恢复 编辑:程序博客网 时间:2024/05/29 08:09
在无向图论问题中,经常需要得到图的最小生成树,用于解决这个问题有两个经典算法:kruskal和prim,前者用于稀疏图,后者用于稠密图。kruskal算法的核心思想是贪心,按照权值顺序,先选取权值最小的边,再选取权值次小的边,依此类推,直到所选边足够把所有的点连接起来,这时边数为节点数-1。但有个选边的前提,那就是待选边不能和已选边组成回路。至此,kruskal算法要解决的问题便成了图的连通分支判断问题。而并查集正是用于求解该问题的有效方法。
并查集是一种树形数据结构,其实现是定义一个长度为N+1(N为图的节点个数)的数组,数组元素值初始化为下标,表示所有的节点都初始化为由一个单点组成的树,每个节点都是自身的祖先。那么并查集如何判断两个连通分支是否是一个连通分支(即构成回路)呢?方法就是查找两棵树的祖先,如果祖先相同,则表示这两个连通分支是一个连通分支。除了查找,并查集还有一个方法用来合并两个连通分支,实现就是把A树(连通分支)的祖先设置为B树(连通分支)的祖先,反过来也行。
kruskal算法通过不断地选边,然后查找这条边的两个节点所在的连通分支,再合并分支,最终得到了一颗最小生成树。算法的时间复杂度为O(NlogN)。
JAVA实现如下:
public class Kruskal {/** * 查找分支中某个元素的祖先,当祖先为自身时停止查找 * @param x * @param branch * @return */public static int find(int x,int[] branch){while(x!=branch[x]){x = branch[x];}return x;}/** * 合并分支,设branch[a]的祖先为b * @param x * @param branch */public static void join(int a,int b,int[] branch){branch[a]=b;}public static void main(String args[]){Scanner in=new Scanner(System.in);//n表示节点数,m表示边数int n = in.nextInt();int m = in.nextInt();Edge[] edges = new Edge[m];Edge edge = null;//读入每条边的信息for(int i=0;i<m;i++){edge = new Edge();edge.a = in.nextInt();edge.b = in.nextInt();edge.w = in.nextInt();edges[i]=edge;}in.close();Arrays.sort(edges);/** * 并查集初始化为N个分支,每个人都是自己的祖先 */int[] branch = new int[n+1];for(int i=0;i<=n;i++){branch[i]=i;}int selected = 0;int weightTotal = 0;//无需回溯for(int i=0;i<m && selected<n-1;i++){//查找两个结点的祖先int rootA = find(edges[i].a,branch);int rootB = find(edges[i].b,branch);if(rootA!=rootB){//合并两个分支,可以把A分支的祖先设为B分支的祖先,反之亦可join(rootA,rootB,branch);weightTotal += edges[i].w;selected ++;}}System.out.println(weightTotal);}}class Edge implements Comparable<Edge>{public int a;public int b;public int w;@Overridepublic int compareTo(Edge e) {return this.w - e.w;}}
0 0
- 并查集在kruskal算法中应用
- Kruskal算法 (并查集)
- 并查集及其简单应用:优化kruskal算法
- 数据结构之Kruskal算法(并查集的应用)
- hdu1879(并查集+Kruskal算法)
- Kruskal算法+并查集实现
- HDU1863并查集和kruskal算法
- 图论 Kruskal算法 并查集
- poj1251 Kruskal算法+并查集
- 并查集实现Kruskal算法
- Kruskal算法的并查集实现
- Kruskal算法(并查集)
- [容易] kruskal 算法并查集实现
- kruskal+ 并查集
- Kruskal+并查集
- Kruskal + 并查集
- 克鲁斯卡尔算法(kruskal)(并查集的简单应用)
- 算法 最小生成树之 kruskal算法+并查集
- sicily 1231. The Embarrassed Cryptography
- Longest Substring Without Repeating Characters
- Servlet:项目中的各个地方的路径问题
- android 可上下滑动切换区域 左右滑动
- 我的swift第一天
- 并查集在kruskal算法中应用
- Intel x86 芯片演进路线图 2016
- GB2312简体中文编码表
- 黑马程序员--Java笔记05--继承 extends 和接口 interface
- Hibernate 映射文件属性介绍
- Replace Template and delete the tables in the drawing
- 绑定MAC的静态IP配置路由器
- Windows 下安装 swoole 具体步骤
- apache反向代理tomcat时x-forwarded-for为null的问题