无向图的最小生成树(克鲁斯卡尔算法 Kruskal)
发布日期:2021-06-30 17:50:54
浏览次数:2
分类:技术文章
本文共 2210 字,大约阅读时间需要 7 分钟。
引子:
克鲁斯卡尔算法的作用是:构建图的最小生成树。
克鲁斯卡尔算法 Kruskal的构造过程:
1、初始化图:n个顶点,n个连通分量(如果两个顶点的连通分量相同,表示两点在同一个连通图中)。把所有的边(包含这个边两端的两个顶点)放入优先级队列中,按照权重从小到大。
2、选择最小权重的边,如果这个边的头顶点的和尾顶点的连通分量不同,则合并头和尾两个分量(整个连通图的点都需要修改,具体看代码)。舍弃该边。(连通分量用整数表示)
3、重复第二步,直到所有的顶点都连接着同一个连通分量里面。
package minTree;import java.util.Comparator;import java.util.Iterator;import java.util.PriorityQueue;import java.util.Queue;public class MinTree_KruskalTest { public static void main(String[] args) { MinTree_Kruskal m = new MinTree_Kruskal(); m.addEdge(0, 1, 6); m.addEdge(0, 2, 1); m.addEdge(0, 3, 5); m.addEdge(0, 4, 10000); m.addEdge(1, 2, 5); m.addEdge(1, 3, 10000); m.addEdge(1, 4, 3); m.addEdge(1, 5, 10000); m.addEdge(2, 3, 5); m.addEdge(2, 4, 6); m.addEdge(2, 5, 4); m.addEdge(3, 4, 10000); m.addEdge(3, 5, 2); m.addEdge(4, 5, 6); m.doKruskal(); }}class MinTree_Kruskal{ private Queueedges = null; public MinTree_Kruskal(){ this.edges = new PriorityQueue<>(new MyComparator()); } public void addEdge(int head, int tail, int weigth){ this.edges.add(new Edge(head, tail, weigth)); } public void doKruskal(){ //优先级队列,按照权重从小到大排列 Queue tempQueue = new PriorityQueue<>(new MyComparator()); Iterator iter = edges.iterator(); //复制队列 while(iter.hasNext()){ tempQueue.add(iter.next()); } int len = tempQueue.size(); //表示各顶点自成一个连通分量 int[] vexSet = new int[len]; for(int i = 0; i < len; i++){ vexSet[i] = i; } for(int i = 0; i < len; i++){ Edge e1 = null; //队列中权重最小的边 e1 = tempQueue.poll(); if(e1 != null){ if(vexSet[e1.head] != vexSet[e1.tail]){ System.out.println(e1.head+" --> "+e1.tail+"; weigth = "+e1.weigth); int t = vexSet[e1.tail]; int h = vexSet[e1.head]; //合并头和尾的连通分量 for(int j = 0; j < len; j++){ if(vexSet[j] == t){ vexSet[j] = h; } } } } } } class Edge{ //头顶点 int head; //尾顶点 int tail; //两点的权重 int weigth; public Edge(int head, int tail, int weigth){ this.head = head; this.tail = tail; this.weigth = weigth; } } /** * 自定义比较器 * @author LiangYH * */ class MyComparator implements Comparator { @Override public int compare(Edge o1, Edge o2) { return o1.weigth - o2.weigth; } }}
转载地址:https://liangyihuai.blog.csdn.net/article/details/48503361 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月29日 20时21分14秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
D*算法
2019-04-30
强化学习(四) —— Actor-Critic演员评论家 & code
2019-04-30
RESTful API
2019-04-30
优化算法(四)——粒子群优化算法(PSO)
2019-04-30
数据在Oracle中的存储
2019-04-30
轨迹规划 trajectory planning
2019-04-30
AGV自动导引运输车
2019-04-30
Trie树(字典树)
2019-04-30
COMP7404 Machine Learing——KNN
2019-04-30
COMP7404 Machine Learing——SVM
2019-04-30
COMP7404 Machine Learing——ROC
2019-04-30
Python量子计算qiskit
2019-04-30
Python的多线程不是真的多线程(GIL全局解释器锁)
2019-04-30