C#,最小生成树(MST)普里姆(Prim)算法的源代码

 Vojtěch Jarník

一、Prim算法简史

Prim算法(普里姆算法),是1930年捷克数学家算法沃伊捷赫·亚尔尼克(Vojtěch Jarník)最早设计;
1957年,由美国计算机科学家罗伯特·普里姆独立实现;
1959年,艾兹格·迪科斯彻再次发现了该算法。

二、Prim算法思路


将点分为两拨,(1)已经加入最小生成树的和(2)未加入的。找到未加入中距离集合最近的点,添加该点,修改其它点到集合的距离。直到所有结点都加入到最小生成树。Prim算法与Dijkstra算法都是贪心算法,适用于稠密图,时间复杂度都是O(V^2);也可以进行优化,其时间复杂度与边数无关。

三、Prim算法描述


(1)以某一个点A开始,将此点加入集合U,并访问其所有经过此点的边。
(2)在这些边寻找权重最小的边,并且要求它的另一个点B没有被访问过。如果 能找到,就将点B加入集合U。接着我们要访问,所有经过点A或点B的边。
(3)重复2的过程,直到所有的点都加入U。
(4)此时由所有边构成的树即为最小生成树。

四、Prim算法源代码

核心代码部分:

1 文本格式

using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    /// <summary>
    /// Prim 算法(邻接矩阵表示的简单实现)
    /// </summary>
    public class MST_Prim_Algorithm
    {
        private static bool IsValidEdge(int u, int v, bool[] inMST)
        {
            if (u == v)
            {
                return false;
            }
            if (inMST[u] == false && inMST[v] == false)
            {
                return false;
            }
            else if (inMST[u] == true && inMST[v] == true)
            {
                return false;
            }
            return true;
        }

        public static int Execute(Undirected_Graph graph, out List<WeightEdge> tree)
        {
            tree = new List<WeightEdge>();
            int V = graph.Vertex_Number;
            int[,] Cost = graph.To_Adjacency_Matrix();
            bool[] inMST = new bool[V];

            inMST[0] = true;

            int edge_count = 0;
            int mincost = 0;
            while (edge_count < V - 1)
            {
                int min = Int32.MaxValue;
                int a = -1;
                int b = -1;
                for (int i = 0; i < V; i++)
                {
                    for (int j = 0; j < V; j++)
                    {
                        if (Cost[i, j] < min)
                        {
                            if (IsValidEdge(i, j, inMST))
                            {
                                min = Cost[i, j];
                                a = i;
                                b = j;
                            }
                        }
                    }
                }

                if (a != -1 && b != -1)
                {
                    tree.Add(new WeightEdge(a,b,min));
                    edge_count++;
                    mincost = mincost + min;
                    inMST[b] = inMST[a] = true;
                }
            }
            return mincost;
        }
    }
}

2 代码格式

using System;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{/// <summary>/// Prim 算法(邻接矩阵表示的简单实现)/// </summary>public class MST_Prim_Algorithm{private static bool IsValidEdge(int u, int v, bool[] inMST){if (u == v){return false;}if (inMST[u] == false && inMST[v] == false){return false;}else if (inMST[u] == true && inMST[v] == true){return false;}return true;}public static int Execute(Undirected_Graph graph, out List<WeightEdge> tree){tree = new List<WeightEdge>();int V = graph.Vertex_Number;int[,] Cost = graph.To_Adjacency_Matrix();bool[] inMST = new bool[V];inMST[0] = true;int edge_count = 0;int mincost = 0;while (edge_count < V - 1){int min = Int32.MaxValue;int a = -1;int b = -1;for (int i = 0; i < V; i++){for (int j = 0; j < V; j++){if (Cost[i, j] < min){if (IsValidEdge(i, j, inMST)){min = Cost[i, j];a = i;b = j;}}}}if (a != -1 && b != -1){tree.Add(new WeightEdge(a,b,min));edge_count++;mincost = mincost + min;inMST[b] = inMST[a] = true;}}return mincost;}}
}

 ——————————————————————

POWER BY 315SOFT.COM &
TRUFFER.CN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/434187.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基础功能认识

文件传输方法 获取桌面文件 回传 3&#xff1a;FTP文件传输协议 进入和退出PYTHON界面 官方自带编译软件 设置中文 接下来安装C环境 安装Wiring库常见问题 终端窗口-------输入gpio -v-----------------输入gpio readall----可能报错&#xff0c;输入 输入gpio readall 可看…

uni-app 微信小程序之红包雨活动

文章目录 1. 页面效果2. 页面样式代码 1. 页面效果 GIF录屏有点卡&#xff0c;实际比较丝滑 每0.5s掉落一个红包控制4s后自动移除红包点击红包消除红包&#xff08;或者自行1&#xff0c;或者弹窗需求&#xff09; 2. 页面样式代码 <!-- 红包雨活动 --> <template>…

总结和考试

总结和考试 1. 代码规范1.1 名称1.2 注释1.3 todo1.4 条件嵌套1.5 简单逻辑先处理1.6 循环1.7 变量和值 2.知识补充2.1 pass2.2 is 比较2.3 位运算 3.阶段总结4.考试题 1. 代码规范 程序员写代码是有规范的&#xff0c;不只是实现功能而已。 1.1 名称 在Python开发过程中会创…

D55XT100-ASEMI整流桥D55XT100参数、封装、规格

编辑&#xff1a;ll D55XT100-ASEMI整流桥D55XT100参数、封装、规格 型号&#xff1a;D55XT100 品牌&#xff1a;ASEMI 正向电流&#xff08;Id&#xff09;&#xff1a;55A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1000V 正向浪涌电流&#xff1a;550A 正向…

shell脚本之循环语句

一 echo命令 echo -n 表示不换行输出 echo -e 表示输出转义符 常用的转义符&#xff1a;要举例为证 二 date date查看当前系统时间 -d 你描述的日期&#xff0c;显示指定字符串所描述的时间&#xff0c;而非当前时间 %F 完整日期格式&#xff0c;等价于 %Y…

跟着pink老师前端入门教程-day11

3、CSS 三角 网页中常见一些三角形&#xff0c;使用CSS直接画出来即可&#xff0c;不必做成图片或字体图标 4、CSS 用户界面样式 4.1 什么是界面样式 界面样式&#xff1a;更改一些用户操作样式&#xff0c;以便提高更好的用户体验&#xff08;更改用户的鼠标样式、表单轮廓…

uniapp 使用echarts做折线图条形图。

提前10天把中烟活动做完了&#xff0c;以为能打酱油到除夕那天&#xff0c;结果又要做什么数据看板&#xff0c;方便烟草领导过年查看数据&#xff0c;还只给5天时间&#xff0c;真实压榨剥削啊&#xff0c;下辈子再也不‘拍黄片’了&#xff0c;不&#xff01;下份工作我就转前…

HCIA学习作业二

要求&#xff1a;基于192.168.1.0/24进行合理划分&#xff0c;要求全网通 [AR3]display ip interface brief [AR3]display ip routing-table [AR1]display ip interface brief [AR1]display ip routing-table [AR2]display ip interface brief [AR2]display ip routing-tab…

STM32(更新中)

目录 1 时钟&#xff08;心跳&#xff09; 1.1 CubeMX基本配置 1.2 外设在时钟上的分配原理 1.3 时钟树 2 寄存器&#xff08;地址&#xff09; 3 GPIO 3.1 GPIO实物 3.2 GPIO两种结构&#xff08;推挽/开漏&#xff09; 3.3 LED 3.4 CUBEMX 3.5 常用函数 …

利用aiohttp异步爬虫实现网站数据高效抓取

前言 大数据时代&#xff0c;网站数据的高效抓取对于众多应用程序和服务来说至关重要。传统的同步爬虫技术在面对大规模数据抓取时往往效率低下&#xff0c;而异步爬虫技术的出现为解决这一问题提供了新的思路。本文将介绍如何利用aiohttp异步爬虫技术实现网站数据抓取&#x…

【深度学习】sdxl中的 tokenizer tokenizer_2 区别

代码仓库&#xff1a; https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main 截图&#xff1a; 为什么有两个分词器 tokenizer 和 tokenizer_2&#xff1f; 在仔细阅读这些代码后&#xff0c;我们了解到 tokenizer_2 主要是用于 refiner 模型的。 #…

如何在yolov8中验证时计算FPS

ultralytics-main/ultralytics/engine/validator.py文件下&#xff0c;第200行左右&#xff0c;添加如下代码 LOGGER.info(fFPS:{(1000 / sum(self.speed.values())):.2f}) speed.values()是一个字典&#xff0c;包括preprocess,inference,loss,postprocess的时间&#xff0c;所…