前言

看一个题目:

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

最小生成树概念:

最小生成树简称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. docker构建带ik分词器Elasticsearch镜像

    创建Dockerfile 文件: FROM elasticsearch:7.4.2 RUN cd /usr/share/elasticsearch && sh -c '/bin/ech ...

  2. 记录: OpenAI中转代理API接口服务的使用

    由于OpenAI提供服务的地区列表里没有 China,因此想要方便使用OpenAI API的话就需要用到中转服务. 本文介绍的iDataRiver平台便提供这样的API,且比官方OpenAI还要便宜, ...

  3. PowerShell alias - cmd中设置别名 快捷的执行命令

    Step. 1: 发现需求 最近学nest.js发现,都是用命令创建工程文件,然后教程里面都是用的快捷命令 比如 pd = pnpm run dev pb = pnpm run build 但是我这里 ...

  4. Java GUI swing 可执行程序 jar (java -jar)idea

    创建项目 可以用maven idea设置 into 那个 参考资料 Java 基础 https://www.liaoxuefeng.com/wiki/1252599548343744/12604545 ...

  5. settings.json 20201209

    李昱版 { "editor.fontSize": 20, "workbench.iconTheme": "material-icon-theme&qu ...

  6. 三种方式使用纯 CSS 实现星级评分

    本文介绍三种使用纯 CSS 实现星级评分的方式.每种都值得细品一番~ 五角星取自 Element Plus 的 svg 资源 <svg xmlns="http://www.w3.org ...

  7. C++自定义比较函数的bug

    auto cmp = [] (int x, int y) {return true;}; priority_queue<int, vector<int> , cmp> q; 报 ...

  8. autowired循环调用

    下面这段代码,表示那你的bean进行了循环调用. org.springframework.beans.factory.BeanCreationException: Error creating bea ...

  9. 记录--说一说css的font-size: 0

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 平常我们说的font-size:0:就是设置字体大小为0对吧,但是它的用处不仅仅如此哦,它还可以消除子行内元素间额外多余的空白! 问题描述 ...

  10. 记录mysql order by xxx limit xxx数据重复的问题

    引用 http://vsalw.com/9768.html 记录mysql排序字段有重复值,分页数据错乱问题,下面2个sql 除了分页limit外,其他都一样, 但是第三页的结果却包含部分第二页的数据 ...