重新整理数据结构与算法(c#)——算法套路普利姆算法[二十九]
前言
看一个题目:

这个问题就是求最小生成树,是图转换为树的一种方式。
最小生成树概念:
最小生成树简称MST。
1.n个顶点,一定有n-1条边
2.包含全部顶点。
3.图转换为最小生成树,权重之和最小。
解题思路:
假设从a开始为顶点,找到和a相接的最小边。
在图中和a相接的是G,那么选择条。然后找到和A、G相接的最小边,是BG,然后选择BG这条边。
以此类推。
正文
代码:
static void Main(string[] args)
{
char[] data = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
int verxs = data.Length;
//邻接矩阵的关系使用二维数组表示,10000这个大数,表示两个点不联通
int[,] weight = new int[,]{
{10000,5,7,10000,10000,10000,2},
{5,10000,10000,9,10000,10000,3},
{7,10000,10000,10000,8,10000,10000},
{10000,9,10000,10000,10000,4,10000},
{10000,10000,8,10000,10000,5,4},
{10000,10000,10000,4,5,10000,6},
{2,3,10000,10000,4,6,10000},};
//创建要修的路,初始化节点的个数
MGraph mGraph = new MGraph(verxs);
//创建一个MinTree对象
MinTree minTree = new MinTree();
minTree.createGraph(mGraph, verxs, data, weight);
Console.WriteLine("显示原始图");
minTree.showGraph(mGraph);
var newGraph=minTree.prim(mGraph, 0);
Console.WriteLine("显示最小生成树图");
minTree.showGraph(newGraph);
Console.Read();
}
}
class MinTree {
//不污染数据
public void createGraph(MGraph mGraph, int verxs, char[] data, int[,] weight)
{
for (int i = 0; i < verxs; i++)
{
mGraph.data[i] = data[i];
for (int j = 0; j < verxs; j++)
{
mGraph.weight[i,j] = weight[i,j];
}
}
}
//遍历图
public void showGraph(MGraph mGraph)
{
for (int i=0;i<mGraph.verxs;i++)
{
for (int j = 0; j < mGraph.verxs; j++)
{
Console.Write(mGraph.weight[i,j]+" ");
}
Console.WriteLine();
}
}
/// <summary>
/// 图转树核心算法
/// </summary>
/// <param name="mGraph">原始图</param>
/// <param name="v">初始化访问节点</param>
public MGraph prim(MGraph mGraph,int v)
{
int[] isVisited = new int[mGraph.verxs];
isVisited[v] = 1;
int y = -1;//y为数组竖轴
int x = -1;//x为数组横轴
MGraph newGraph = new MGraph(mGraph.verxs);
newGraph.data = (char[])mGraph.data.Clone();
int minWeight = 1000;
//一共要计算出verxs-1条边
for (int k=1;k<mGraph.verxs;k++)
{
for (int i=0;i<mGraph.verxs;i++)
{
for (int j = 0; j < mGraph.verxs ; j++)
{
if (isVisited[i] == 1 && isVisited[j] == 0 && mGraph.weight[i, j] < minWeight)
{
y = i;
x = j;
minWeight = mGraph.weight[i, j];
}
}
}
Console.WriteLine("在"+mGraph.data[y]+"和"+ mGraph.data[x]+"之间修了一条权重为"+minWeight+"的路");
newGraph.weight[y,x] = minWeight;
isVisited[x] = 1;
minWeight = 1000;
}
return newGraph;
}
}
结果:

重新整理数据结构与算法(c#)——算法套路普利姆算法[二十九]的更多相关文章
- 最小生成树-普利姆算法eager实现
算法描述 在普利姆算法的lazy实现中,参考:普利姆算法的lazy实现 我们现在来考虑这样一个问题: 我们将所有的边都加入了优先队列,但事实上,我们真的需要所有的边吗? 我们再回到普利姆算法的lazy ...
- 最小生成树-普利姆算法lazy实现
算法描述 lazy普利姆算法的步骤: 1.从源点s出发,遍历它的邻接表s.Adj,将所有邻接的边(crossing edges)加入优先队列Q: 2.从Q出队最轻边,将此边加入MST. 3.考察此边的 ...
- 普利姆算法(prim)
普利姆算法(prim)求最小生成树(MST)过程详解 (原网址) 1 2 3 4 5 6 7 分步阅读 生活中最小生成树的应用十分广泛,比如:要连通n个城市需要n-1条边线路,那么怎么样建设才能使工程 ...
- 算法与数据结构(五) 普利姆与克鲁斯卡尔的最小生成树(Swift版)
上篇博客我们聊了图的物理存储结构邻接矩阵和邻接链表,然后在此基础上给出了图的深度优先搜索和广度优先搜索.本篇博客就在上一篇博客的基础上进行延伸,也是关于图的.今天博客中主要介绍两种算法,都是关于最小生 ...
- HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))
继续畅通工程 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- 最小生成树-普利姆(Prim)算法
最小生成树-普利姆(Prim)算法 最小生成树 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一种特殊的图),或者 ...
- 图论---最小生成树----普利姆(Prim)算法
普利姆(Prim)算法 1. 最小生成树(又名:最小权重生成树) 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一 ...
- 查找最小生成树:普里姆算法算法(Prim)算法
一.算法介绍 普里姆算法(Prim's algorithm),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之 ...
- hdu 1233:还是畅通工程(数据结构,图,最小生成树,普里姆(Prim)算法)
还是畅通工程 Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- c/c++ 用普利姆(prim)算法构造最小生成树
c/c++ 用普利姆(prim)算法构造最小生成树 最小生成树(Minimum Cost Spanning Tree)的概念: 假设要在n个城市之间建立公路,则连通n个城市只需要n-1条线路.这时 ...
随机推荐
- form 表单提交 保存的时候再提交文件,之前一直是选择文件就传了,这个也比较好
form 表单提交 保存的时候再提交文件,之前一直是选择文件就传了,这个也比较好 代码 <Upload :action="action" :max-size="ma ...
- PlacementList must be sorted by first 8 bits of display_id 问题
问题暂未解决 [37484:0811/103448.115:ERROR:display_layout.cc(551)] PlacementList must be sorted by first 8 ...
- 摆脱鼠标操作 - vscode - vim - 官方说明文档 github上的,防止打不开,这里发一个
Key - command done - command done with VS Code specific customization ️ - some variations of the com ...
- C# 常用特性(Attribute)
目录 指定方法实现的属性MethodImplAttribute 标记不再使用的程序元素ObsoleteAttribute 指定属性或事件的说明DescriptionAttribute 未完待续... ...
- 数据处理——IF函数求同时满足多个条件 多个条件满足一个以上
以满足两个条件为例,满足多个条件类似 以如下案例为例进行说明: 一.IF公式同时满足多个条件 此例也可使用函数的嵌套,对于函数使用掌握不牢的新手,嵌套使用会有些困难,以下方法针对刚入门学习参考 1.利 ...
- springboot+springsecurity+layui+cherryMd博客系统
演示地址:http://175.24.198.63:9090/front/index PS: 演示环境的服务器配置很低,带宽很小,若打开速度较慢,稍微等等哦~ 现在动不动就是前后端分离,其实访问量不大 ...
- c基础-指针、函数与预处理器
指针.函数.预处理器 目录 指针.函数.预处理器 1.指针 解引用 指针运算 数组和指针 const char *, char const *, char * const,char const * c ...
- 3DCAT为华东师大设计学院打造元宇宙数字虚拟学院
6月11日,华东师范大学设计学院在chi K11美术馆举办了一场别开生面的 2023 年本科毕业设计暨项目实践教学现场演示展.其中,元宇宙数字虚拟学院(一期)的现场发布会引起了现场震撼,吸引了众多观众 ...
- golang 依赖控制反转(IoC) 改进版
最近在开发基于golang下的cqrs框架 https://github.com/berkaroad/squat (陆续开发中,最近断了半年,懒了...).这个框架依赖ioc框架,因为之前写了一个io ...
- CoordinatorLayout滑动抖动问题
目录介绍 01.CoordinatorLayout滑动抖动问题描述 02.滑动抖动问题分析 03.自定义AppBarLayout.Behavior说明 04.CoordinatorLayout滑动抖动 ...