最小生成树-Prim算法和Kruskal算法
原文链接:https://blog.csdn.net/lsgo_myp/article/details/91435589
Prim算法
加点法
1.算法简单描述
1).输入:一个加权连通图,其中顶点集合为V,边集合为E;
2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;
3).重复下列操作,直到Vnew = V:
a.在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;
4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApp1 { class Program { //结点初始状态 static int N = -1; //结点已加入状态 static int Y = 1; static void Main( string [] args) { //起始点 顶点以0开始 A顶点为0,B为1 int start = 3; //无向图邻接矩阵 int [,] map = new int [7, 7] { {0,7,N,5,N,N,N }, //A顶点的边 {7,0,8,9,7,N,N }, //B顶点的边 {N,8,0,N,5,N,N }, //C顶点的边 {5,9,N,0,N,6,N }, //D顶点的边 {N,7,5,N,0,8,9 }, //E 顶点的边 {N,N,N,6,8,0,11 }, //F 顶点的边 {N,N,N,N,9,11,0 }, //G顶点的边 }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | //已选的点集合 int [] vNew = new int [map.GetLength(0)]; //置为初始状态 ,此时未加入任何结点 for ( int i = 0; i < vNew.Length; i++) { //N代表为加入结点 vNew[i] = N; } //加入初始结点 vNew[start] = Y; int len = GetMST(vNew, map); Console.WriteLine( "最小生成树权值为:" +len); Console.ReadKey(); } /// <summary> /// 普里姆算法 /// </summary> /// <param name="vNew">已加入的结点,初始值需设定</param> /// <param name="map">无向图的邻接矩阵</param> /// <returns></returns> private static int GetMST( int [] vNew, int [,]map) { //找出vNew点中与未选择的边组成的最小值 int length = 0; while (vNew.Count(temp=>temp==Y)<map.GetLength(0)) { int minLength = int .MaxValue; int minNewNode = N; int minStartNode = N; for ( int i = 0; i < vNew.Length; i++) { if (vNew[i] == Y) { for ( int j = 0; j < map.GetLength(1); j++) { //未选择的结点已vNew中的结点组成的边 if (vNew[j] == N) { if (map[i, j] != N) { if (map[i, j] < minLength) { // Console.WriteLine("边{0}{1}", i, j); minLength = map[i, j]; minNewNode = j; minStartNode = i; } } } } } } if (minNewNode==N) { |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | //此处图的邻接矩阵数据不正确 throw new Exception( "图的邻接矩阵数据不正确" ); } else { vNew[minNewNode] = Y; Console.WriteLine( "顶点{0}加入" , ConvertToChar( minNewNode)); Console.WriteLine( "边{0}--{1}加入" , ConvertToChar(minStartNode), ConvertToChar(minNewNode)); length += minLength; } } return length; } /// <summary> /// 转换成字符,方便查看 /// </summary> /// <param name="charValue"></param> /// <returns></returns> private static char ConvertToChar( int charValue) { int k = charValue + 65; return ( char )k; } } } |
Kruskal算法
加边法
分类:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2023-03-28 在 HTML 文档中使用 class 属性
2023-03-28 ztree 右键菜单功能
2023-03-28 js树形控件—zTree使用,右键出现菜单
2023-03-28 详解C# List<T>的Contains,Exists,Any,Where性能对比
2023-03-28 Request.url请求路径的一些属性
2023-03-28 C#中虚方法(virtual)详解
2023-03-28 C# override详解