核心思想

假设连通网G=(V,E),令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),概述图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点分别在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边而选择下一条代价最小的边。依此类推,直至T中所有顶点构成一个连通分量为止

理解:图中的每个顶点都是一个连通分量,每次去寻找权值最小的边,然后判断最小生成树加入这条边是否会形成环,意思就是如果在不同的连通分量中则可以加入,如果在想通的连通分量中则不可以合并因为会构成环,怎么去判断是否在同一个连通分量中,就是判断他们是否在一个集合中。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Kruskal
{public class Vertex{public object Data;public Vertex(object data){this.Data = data;}}public class Edge{public int Start;public int End;public int Weight;public Edge(int start, int end, int weight){this.Start = start;this.End = end;this.Weight = weight;}}public class Graph{public int VertexCount;public Edge[] Edges;public Vertex[] Vertexs;public Graph(Vertex[] vertexs,Edge[] edges){this.Vertexs = vertexs;this.Edges = edges;this.VertexCount = vertexs.Length;}private static void SortEdges(Edge[] edges){for (int i = 0; i < edges.Length-1; i++){if (edges[i].Weight > edges[i+1].Weight){Edge t = edges[i];edges[i] = edges[i + 1];edges[i + 1] = t;}}}private static int Find(int[] Vertexs,int index){while (Vertexs[index] > -1){index = Vertexs[index];}return index;}public static void Kruskal(Graph graph){//1.生成父亲数组用于判断是否在想通的连通分量中int[] parent = new int[graph.VertexCount];for (int i = 0; i < parent.Length; i++){parent[i] = -1;}//2.对边进行排序SortEdges(graph.Edges);//3.判断是否在想通的连通分量中=是否构成回路(环)for (int i = 0; i < graph.Edges.Length; i++){int startRoot = Find(parent, graph.Edges[i].Start);int endRoot = Find(parent, graph.Edges[i].End);if (startRoot != endRoot){parent[endRoot] = startRoot;Debug.LogError("(" + graph.Edges[i].Start + "," + graph.Edges[i].End + ") ");}}}}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Kruskal;
public class TestKruskal : MonoBehaviour
{Graph graph;void Start(){Vertex[] vertexs = GenerateVertex(9);Edge[] edges = GenerateEdges();graph = new Graph(vertexs, edges);Graph.Kruskal(graph);}private Vertex[] GenerateVertex(int len){Vertex[] vertexs = new Vertex[len];for (int i = 0; i < len; i++){vertexs[i] = new Vertex(i);}return vertexs;}private Edge[] GenerateEdges(){Edge edge0 = new Edge(0, 1, 10);Edge edge1 = new Edge(0, 5, 11);Edge edge2 = new Edge(1, 2, 18);Edge edge3 = new Edge(1, 6, 16);Edge edge4 = new Edge(1, 8, 12);Edge edge5 = new Edge(2, 3, 22);Edge edge6 = new Edge(2, 8, 8);Edge edge7 = new Edge(3, 4, 20);Edge edge8 = new Edge(3, 7, 16);Edge edge9 = new Edge(3, 8, 21);Edge edge10 = new Edge(4, 5, 26);Edge edge11 = new Edge(4, 7, 7);Edge edge12 = new Edge(5, 6, 17);Edge edge13 = new Edge(6, 7, 19);Edge edge14 = new Edge(6, 7, 19);Edge[] edges = { edge0, edge1, edge2, edge3, edge4, edge5, edge6, edge7, edge8, edge9, edge10, edge11, edge12, edge13, edge14 };return edges;}
}

克鲁斯卡尔(Kruskal)相关推荐

  1. 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)

    目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...

  2. 对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度

    对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的 边.说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度

  3. 【算法】克鲁斯卡尔 (Kruskal) 算法

    目录 1.概述 2.代码实现 2.1.并查集 2.2.邻接矩阵存储图 2.3.邻接表存储图 2.4.测试代码 3.应用 本文参考: <数据结构教程>第 5 版 李春葆 主编 1.概述 (1 ...

  4. 算法之克鲁斯卡尔(Kruskal)算法

    克鲁斯卡尔(Kruskal)算法 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路 具体做法:首先 ...

  5. 算法:通过克鲁斯卡尔(Kruskal)算法,求出图的最小生成树

    之前我给大家分享过用普利姆(Prim)算法来求出图的最小生成树(点我去看看),今天我再给大家分享一个也是求图的最小生成树的克鲁斯卡尔(Kruskal)算法 克鲁斯卡尔(Kruskal)算法,就相当于先 ...

  6. 普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法

    图是一种基础又重要的数据结构,图的生成树是图的一个极小连通子图.最小生成树是无向连通网的所有生成树中边的权值之和最小的一棵生成树.求图的最小生成树可以牵引出很多经典的题目,例如在N个城市之间建立通讯网 ...

  7. Java实现之克鲁斯卡尔(Kruskal)算法

    一.问题引入 1.问题引入 1)某城市新增7个站点(A,B,C,D,E,F,G),现在需要修路把7个站点连通 2)各个站点的距离用边线表示(权),比如A-B距离12公里 3)问:如何修路保证各个站点都 ...

  8. 【数据结构与算法】克鲁斯卡尔(Kruskal)算法

    一,应用场景 公交站问题 1)某城市新增7个站点(A,B,C,D,E,F,G),现在需要修路把7个站点连通 2)各个站点的距离用边线表示(权),比如 A - B距离12公里 3)问:如何修路保证各个站 ...

  9. 普里姆算法(Prim)和克鲁斯卡尔(Kruskal)算法

    普里姆算法(Prim)和克鲁斯卡尔(Kruskal)算法 普里姆算法的基本思想: 取图中任意一个顶点 v 作为生成树的根,之后往生成树上添加新的顶点 w.添加顶点w的条件为:w 和已在生成树上的顶点v ...

  10. 7、最小生成树,克鲁斯卡尔(Kruskal)算法

    1)算法的基本思想: 前面我们学习过Prim算法,他是一种以某个节点出发,按权值递增的次序选择合适的边来构造最小生成树的方法,他的时间复杂度为O(n2),与顶点有关,而与边无边,所以适合求边稠密的图的 ...

最新文章

  1. tensorflow问题
  2. 一道百度算法面试题讲解
  3. 中兴今年的毕业生面试题,给大家参考参考
  4. oracle undo 缩小,缩小Oracle的系统表空间(SYSTEM、TEMP、UNDOTBS1、SYSAUX)
  5. 【windows】windows系统下,在任务管理器的进程选项卡中查看PID/任务管理器怎么查看PID...
  6. Hbulider代码注释,缩进问题 - 设置篇
  7. SHT30温湿度传感器工作原理
  8. Flutter之常用组件的使用举例(中)
  9. SpringMVC整合mybatis(终结版)
  10. 尝试解决cocos2dx字体模糊时的一点收获
  11. 做好SEO需要考虑什么
  12. 自由转场低温吹风不伤发,诗恩无线吹风机防水级更安全
  13. table_schem是什么意思
  14. 全国计算机等级考试python(刷题软件)
  15. 文件读写操作:把文件a.txt中的内容复制到文件b.txt中
  16. 正则表达式split匹配多种例如 “】”,“,”两种(页面级中英文切换方案)...
  17. c++ opencv数字图像处理:访问图像像素,遍历图像像素
  18. 翻遍100个网站,为你找到了2019年最好看的18张数据可视化
  19. 液晶电视工作原理(转)
  20. 【报告分享】中国留学生归国求职洞察报告-领英(附下载)

热门文章

  1. 玩家自述:遇到欠费请拨9电话骗局如何应对?
  2. 软件测试需要学什么课程?好学吗?
  3. hdu 杭电1429 胜利大逃亡(续)
  4. ASM PCRP21-100-1-SSI-KAB5M
  5. 全球各大运营商代码。方便国外卡的朋友修改运营商显示
  6. 【音视频】国标双向对讲方案
  7. AVFoundation(一)
  8. 我就这样忍了一生——星云大师
  9. JAVA初中作品_美术作品大全初中生
  10. 计算机核心期刊论文审回,专家审回一般要多长时间