前言

看一个题目:

这个问题就是求最小生成树,是图转换为树的一种方式。

最小生成树概念:

最小生成树简称MST。

1.n个顶点,一定有n-1条边

2.包含全部顶点。

3.图转换为最小生成树,权重之和最小。

解题思路:

  1. 假设从a开始为顶点,找到和a相接的最小边。

  2. 在图中和a相接的是G,那么选择条。然后找到和A、G相接的最小边,是BG,然后选择BG这条边。

  3. 以此类推。

正文

代码:

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#)——算法套路普利姆算法[二十九]的更多相关文章

  1. 最小生成树-普利姆算法eager实现

    算法描述 在普利姆算法的lazy实现中,参考:普利姆算法的lazy实现 我们现在来考虑这样一个问题: 我们将所有的边都加入了优先队列,但事实上,我们真的需要所有的边吗? 我们再回到普利姆算法的lazy ...

  2. 最小生成树-普利姆算法lazy实现

    算法描述 lazy普利姆算法的步骤: 1.从源点s出发,遍历它的邻接表s.Adj,将所有邻接的边(crossing edges)加入优先队列Q: 2.从Q出队最轻边,将此边加入MST. 3.考察此边的 ...

  3. 普利姆算法(prim)

    普利姆算法(prim)求最小生成树(MST)过程详解 (原网址) 1 2 3 4 5 6 7 分步阅读 生活中最小生成树的应用十分广泛,比如:要连通n个城市需要n-1条边线路,那么怎么样建设才能使工程 ...

  4. 算法与数据结构(五) 普利姆与克鲁斯卡尔的最小生成树(Swift版)

    上篇博客我们聊了图的物理存储结构邻接矩阵和邻接链表,然后在此基础上给出了图的深度优先搜索和广度优先搜索.本篇博客就在上一篇博客的基础上进行延伸,也是关于图的.今天博客中主要介绍两种算法,都是关于最小生 ...

  5. HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  6. 最小生成树-普利姆(Prim)算法

    最小生成树-普利姆(Prim)算法 最小生成树 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一种特殊的图),或者 ...

  7. 图论---最小生成树----普利姆(Prim)算法

    普利姆(Prim)算法 1. 最小生成树(又名:最小权重生成树) 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一 ...

  8. 查找最小生成树:普里姆算法算法(Prim)算法

    一.算法介绍 普里姆算法(Prim's algorithm),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之 ...

  9. hdu 1233:还是畅通工程(数据结构,图,最小生成树,普里姆(Prim)算法)

    还是畅通工程 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  10. c/c++ 用普利姆(prim)算法构造最小生成树

    c/c++ 用普利姆(prim)算法构造最小生成树 最小生成树(Minimum Cost Spanning Tree)的概念: ​ 假设要在n个城市之间建立公路,则连通n个城市只需要n-1条线路.这时 ...

随机推荐

  1. 前端css阴影画图

    在线演示地址:css阴影画图 一,在css中有一个box-shadow属性,可以设置元素的阴影. .item{ width: 50px; height: 50px; background: #0096 ...

  2. Codeforces(1500板刷)

    目录 写在前面 1. A. Did We Get Everything Covered?(构造.思维) 题目链接 题意 题解 代码 总结 2 F. Greetings(离散化+树状数组) 题目链接 题 ...

  3. Codeforces Round 922 (Div. 2)(A~D)补题

    A题考虑贪心,要使使用的砖头越多,每块转的k应尽可能小,最小取2,最后可能多出来,多出来的就是最后一块k=3,我们一行内用到的砖头就是\(\frac{m}{2}\)下取整,然后乘以行数就是答案. #i ...

  4. 新增、修改校验逻辑使用-Validation-的group分组校验完成-2022新项目

    一.业务场景 一般在项目开发中少不了新增.修改操作,这两个操作中传递的参数中也仅仅只有一个参数是不一致的,新增操作时没有ID, 修改时有ID,其校验逻辑也只有这一个ID校验的差别.最开始自己在写代码时 ...

  5. BES2500开发板介绍和入门

    一 前记 BES2500是恒玄科技推出的款高端的TWS耳机芯片,该芯片的性能非常强悍.蓝牙5.2双模,1.8M的SRAM空间,ARM-M33的主核,绝对是音频耳机芯片中的高配,性能不是一般的强.该芯片 ...

  6. python删除指定文件夹下文件和文件夹的方法

    前记   python删除指定文件夹下的文件,是一个常用的功能.我找了不少地方,一直没有找到合适的模版,那只好自己倒腾一个比较实用的模版了. 基本模块   这里面会用到几个模块,一个是目录下所有文件的 ...

  7. 逆向通达信Level-2 续三 (KTL python控制台动态调试)

    python控制台逆向分析. python 跟 js 自如切换 逆向通达信Level-2 续十一 (无帐号登陆itrend研究版) 逆向通达信Level-2 续十 (trace脱壳) 逆向通达信Lev ...

  8. STM32 启动代码分析

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  9. 使用元类实现Django的ORM

    一.ORM基本介绍 ORM 是 python编程语言后端web框架 Django的核心思想,"Object Relational Mapping",即对象-关系映射,简称ORM. ...

  10. postgresql关于array类型有交集(包含查询数据任意元素,有重叠&&)的一些查询方法以及sqlalchemy语句实现

    表接结构如下 class MachineFixDoc(Base): """ 设备报修单,代理或用户向公司申请报修 """ __tablena ...