
最小生成树——Kurskal算法
发布日期:2021-05-07 03:17:50
浏览次数:22
分类:原创文章
本文共 4203 字,大约阅读时间需要 14 分钟。
背景: 最近精神上受到打击,时常怀疑人生,怀疑人生的时候,就时常写写算法冷静,今天给小伙伴们介绍图的最小生成树的算法之——Kurskal算法;
…
由于小猿的文采不咋滴,就不长篇大作了,所有故事都在代码里:
package ALG;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Scanner;/** * 最小生成树:Kruskal算法; * * 思想: * 1.将边排序,从小到大按边的权寻找两个节点; * 2.如果构成回路,则continue,往下继续寻找; * * */public class Kruskal { // 用于存储所有边; private static List<Edge> edges = new ArrayList<>(); // 用来记录当前节点的终结点; private static HashMap<Character, Character> ed = new HashMap<>(); static Scanner input = new Scanner(System.in); // 作为内部类,边的属性:权值,起点,终点; static class Edge { int weight; char start; char end; Edge(char start, char end, int weight) { this.start = start; this.end = end; this.weight = weight; } } public static void main(String[] args) { // 初始化,创建一个图; createGraph(); // 这里利用快排将边按权值从小到大排序(可以用其他排序); quickSortGraph(edges); // 初始化,记录结点当前的状态,初始化设为自己; for (Edge edge : edges) { ed.put(edge.start, edge.start); ed.put(edge.end, edge.end); } // 用于存储最小生成树的节点; List<Edge> result = new ArrayList<>(); // 利用Kruskal算法生成最小生成树; result = kruskal(edges, ed); // 记录最小生成树的权值之和; int minWeight = 0; for (Edge edge : result) { minWeight += edge.weight; System.out.print("( " + edge.start + "," + edge.end + " )\t"); } System.out.println("the min weight: " + minWeight); } private static List<Edge> kruskal(List<Edge> edges, HashMap<Character, Character> ed) { List<Edge> result = new ArrayList<>(); for (Edge edge : edges) { // 判断是否会产生回路,判断的方法是: // 如果start的终点与end的终点是一样的时候,就证明此时会产生回路,返回false; // 否则,不会产生回路; if (checkEdgeStatus(edge.start, edge.end, ed)) { // 不会产生回路的时候,该结点即为最小生成树中的其中一个结点; result.add(edge); // 改变所有结点的终点位置; changeAllEnd(ed, edge.start, edge.end); } } return result; } private static void changeAllEnd(HashMap<Character, Character> ed, char start, char end) { // 用pivot保存start的终点,用于接下来将所有终点为pivot的点更新其终点为end的终点 char pivot = ed.get(start); for (Character key : ed.keySet()) { if (ed.get(key) == pivot) { ed.put(key, ed.get(end)); } } } private static boolean checkEdgeStatus(char start, char end, HashMap<Character, Character> ed) { // 检查start与end的终点是否相同; char point1 = ed.get(start); char point2 = ed.get(end); return point1 != point2; } // 接下来快排的算法(分治,递归); private static void quickSortGraph(List<Edge> edges) { quickSort(edges, 0, edges.size() - 1); } private static void quickSort(List<Edge> edges, int start, int end) { int pivot; while(start < end) { pivot = quick(edges, start, end); quickSort(edges, start, pivot - 1); start = pivot + 1; } } private static int quick(List<Edge> edges, int start, int end) { Edge key = edges.get(start); while(start < end) { Edge edge; while (start < end && edges.get(end).weight >= key.weight) { end --; } edge = edges.get(end); edges.set(start, edge); while(start < end && edges.get(start).weight <= key.weight) { start ++; } Edge edge1; edge1 = edges.get(start); edges.set(end, edge1); } edges.set(start, key); return start; } // 创建图; private static void createGraph() { while(true) { char start = input.next().charAt(0); char end = input.next().charAt(0); int weight = input.nextInt(); if (weight == -1) { break; } edges.add(new Edge(start, end, weight)); } } // 打印所有边的信息 private static void printGraph(List<Edge> edges) { for (Edge edge : edges) { System.out.println(edge.start + "-" + edge.end + "-" + edge.weight); } }}
运行结果:
下一篇将介绍最小生成树的另一种算法:Prim 算法
发表评论
最新留言
很好
[***.229.124.182]2025年04月01日 04时43分29秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
纵览全局的框框——智慧搜索
2021-05-09
手把手教你如何快速构建应用内消息推送与运营能力
2021-05-09
快服务流量之争:如何在快服务中占领一席之地
2021-05-09
【活动】直播揭秘<如何从0开发HarmonyOS硬件>
2021-05-09
Cocos平台集成AGC性能管理(二)—— 性能管理SDK集成
2021-05-09
华为推送服务 | 简单一招,提高用户活跃和留存
2021-05-09
基于Cocos SDKHub接入华为HMS Game服务—打包上架流程
2021-05-09
Unity平台 | 快速集成华为性能管理服务
2021-05-09
详细实例教程!集成华为虚假用户检测,防范虚假恶意流量
2021-05-09
对模拟器虚假设备识别能力提升15%!每日清理大师App集成系统完整性检测
2021-05-09
使用Power BI构建数据仓库与BI方案
2021-05-09
pytest封神之路第二步 132个命令行参数用法
2021-05-09
Django认证系统并不鸡肋反而很重要
2021-05-09
快用Django REST framework写写API吧
2021-05-09
tep用户手册帮你从unittest过渡到pytest
2021-05-09
12张图打开JMeter体系结构全局视角
2021-05-09
学习版pytest内核测试平台开发万字长文入门篇
2021-05-09
Spring Cloud Stream如何消费自己生产的消息?
2021-05-09
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现
2021-05-09
Spring Boot 2.x基础教程:构建RESTful API与单元测试
2021-05-09