C#,最小生成树(MST)博鲁夫卡(Boruvka)算法的源代码

 Otakar Boruvka

本文给出Boruvka算法的C#实现源代码。

Boruvka算法用于查找边加权图的最小生成树(MST),它早于Prim和Kruskal的算法,但仍然可以被认为是两者的关联。

一、Boruvka算法的历史

1926年,奥塔卡·博鲁夫卡(Otakar Boruvka)首次提出了一种求给定图的MST的方法。这在计算机出现之前就已经存在了,事实上,它被用来设计一个高效的配电系统。

Georges Sollin在1965年重新发现了它,并将其用于并行计算。

二、Boruvka算法的思路

该算法的核心思想是从一组树开始,每个顶点代表一棵孤立的树。然后,我们需要不断增加边,以减少孤立树的数量,直到我们有一个单一的连接树。
让我们通过一个示例图逐步了解这一点:

步骤0:创建一个图表;
步骤1:从一堆未连接的树开始(树的数量=顶点的数量);
步骤2:当存在未连接的树时,对于每个未连接的树:
(1)以较小的重量找到它的边缘
(2)添加此边以连接另一棵树

三、Boruvka算法的源代码

1、核心代码

using System;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{/// <summary>/// 图的连接边信息/// </summary>public class EdgeInfo{/// <summary>/// 起始节点编码(按一般教材习惯,1起步)/// </summary>public int Start { get; set; } = 0;/// <summary>/// 终点编码(按一般教材习惯,也从1起步)/// </summary>public int End { get; set; } = 0;/// <summary>/// 边的权值/// </summary>public int Weight { get; set; } = 0;/// <summary>/// 构造函数/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <param name="c"></param>public EdgeInfo(int a, int b, int c){this.Start = a;this.End = b;this.Weight = c;}}/// <summary>/// MST-Boruvka算法/// </summary>public static class Boruvka_Minium_Spaning_Tree{private static int[] Parent { get; set; } = null;private static int[] Minium { get; set; } = null;/// <summary>/// 计算最小生成树(MST)的最小代价及树信息/// </summary>/// <param name="graph">图信息(边列表)</param>/// <param name="tree">返回树信息(边的列表)</param>/// <returns></returns>public static int Execute(EdgeInfo[] graph, out List<int> tree){tree = new List<int>();// 计算最大节点编号int N = 0;for (int i = 0; i < graph.Length; i++){if (graph[i].Start > N) N = graph[i].Start;if (graph[i].End > N) N = graph[i].End;}Parent = new int[N + 1];for (int i = 1; i <= N; i++){Parent[i] = i;}Minium = new int[N + 1];int result = 0;int components = N;while (components > 1){for (int i = 1; i <= N; i++){Minium[i] = -1;}for (int i = 0; i < graph.Length; i++){if (Root(graph[i].Start) == Root(graph[i].End)){continue;}int r_v = Root(graph[i].Start);if (Minium[r_v] == -1 || graph[i].Weight < graph[Minium[r_v]].Weight){Minium[r_v] = i;}int r_u = Root(graph[i].End);if (Minium[r_u] == -1 || graph[i].Weight < graph[Minium[r_u]].Weight){Minium[r_u] = i;}}for (int i = 1; i <= N; i++){if (Minium[i] != -1){if (Merge(graph[Minium[i]].Start, graph[Minium[i]].End)){result += graph[Minium[i]].Weight;tree.Add(Minium[i]);components--;}}}}return result;}private static int Root(int v){if (Parent[v] == v){return v;}return Parent[v] = Root(Parent[v]);}private static bool Merge(int v, int u){v = Root(v);u = Root(u);if (v == u){return false;}Parent[v] = u;return true;}}
}

2、测试与显示

List<EdgeInfo> g = new List<EdgeInfo>();
g.Add(new EdgeInfo(1, 2, 6));
g.Add(new EdgeInfo(1, 3, 1));
g.Add(new EdgeInfo(1, 4, 4));
g.Add(new EdgeInfo(1, 5, 4));
g.Add(new EdgeInfo(2, 4, 2));
g.Add(new EdgeInfo(2, 5, 2));
g.Add(new EdgeInfo(3, 4, 8));int weight = Boruvka_Minium_Spaning_Tree.Execute(g.ToArray(), out List<int> path);
StringBuilder sb = new StringBuilder();
sb.AppendLine("The minium weight is: " + weight + "<br>");
sb.AppendLine("The minium tree is : <br>");
foreach (int idx in path)
{sb.AppendLine("("+g[idx].Start + " --- " + g[idx].End + ") weight = " + g[idx].Weight + "<br>");
}
webBrowser1.DocumentText = sb.ToString();

更多算法源代码将陆续发布,建议关注。

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

POWER BY TRUFFER.CN

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

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

相关文章

redis 分布式锁的原理

Redis 分布式锁是通过利用 Redis 的原子操作和特性来实现的。下面是 Redis 分布式锁的基本原理&#xff1a; 获取锁&#xff1a;当一个进程或线程需要获取锁时&#xff0c;它会通过执行 Redis 命令&#xff08;例如 SETNX&#xff09;在 Redis 中尝试设置一个特定的键作为锁。如…

QQ云端机器人登录系统php源码

这款源码主要是针对群机器人爱好者的&#xff0c;这是一个通过对接挂机宝里面机器人框架的一个网页站点&#xff0c;用户通过网页登录 QQ 账号至挂机宝里面框架&#xff08;可扫码登录、账密登录、跳转 QQ 快捷登录&#xff09;&#xff0c;无需通过机器人即可实现登录&#xf…

《设计模式的艺术》笔记 - 观察者模式

介绍 观察者模式定义对象之间的一种一对多依赖关系&#xff0c;使得每当一个对象状态发生改变时&#xff0c;其相关依赖对象皆得到通知并被自动更新。 实现 myclass.h // // Created by yuwp on 2024/1/12. //#ifndef DESIGNPATTERNS_MYCLASS_H #define DESIGNPATTERNS_MYCLA…

Oracle Linux 6.10 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

ZK高可用架构涉及常用功能整理

ZK高可用架构涉及常用功能整理 1. zk的高可用系统架构和相关组件1.1 Quorum机制1.2 ZAB协议 2. zk的核心参数2.1 常规配置2.2 特殊优化配置 3. zk常用命令3.1 常用基础命令3.2 常用运维命令 4. 事务性4.1 数据写流程4.2 数据读流程 5. 疑问和思考5.1 zk不擅长处理哪些场景&…

gitlab runner 安装、注册、配置、使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

「一本通 3.6 例 1」分离的路径

题目描述 为了从 F F F 个草场中的一个走到另一个&#xff0c;贝茜和她的同伴们不得不路过一些她们讨厌的可怕的树。奶牛们已经厌倦了被迫走某一条路&#xff0c;所以她们想建一些新路&#xff0c;使每一对草场之间都会至少有两条相互分离的路径&#xff0c;这样她们就有多一…

vue常用指令(v-show)

一、v-show 指令 作用: 根据真假值,切换元素的显示状态 二、代码演示 1、v-show 绑定判断条件后&#xff0c;根据布尔值决定是否显示图片 不显示图片 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><…

骨传导是哪个意思?骨传导的应用领域在哪

很多人都问我骨传导是哪个意思&#xff1f;骨传导的应用领域在哪&#xff1f;我们都知道声音能够在固体、液体、空气三种介质中传播。通常情况下&#xff0c;声音进入我们内耳的方式主要有两种&#xff1a;空气传导和骨传导&#xff0c;骨传导也就是通过固体传导。我们比较熟悉…

深度学习——pycharm远程连接

目录 远程环境配置本地环境配置&#xff08;注意看假设&#xff01;&#xff01;!这是很多博客里没写的&#xff09;步骤1步骤2步骤2.1 配置Connection步骤2.2 配置Mappings 步骤3 配置本地项目的远程解释器技巧1 pycharm中远程终端连接技巧2 远程目录技巧3 上传代码文件技巧4 …

2024.1.23力扣每日一题——最长交替子数组

2024.1.23 题目来源我的题解方法一 枚举 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2765 我的题解 方法一 枚举 每次都以两个相邻作为满足要求的循环数据&#xff0c;并且以一个布尔变量控制循环的位置 时间复杂度&#xff1a;O(n) 空间复杂度&#xff1a;O(1) pub…

【图像拼接】论文精读:Eliminating Structure and Intensity Misalignment in Image Stitching

第一次来请先看这篇文章:【图像拼接(Image Stitching)】关于【图像拼接论文精读】专栏的相关说明,包含专栏使用说明、创新思路分享等(不定期更新) 图像拼接系列相关论文精读 Seam Carving for Content-Aware Image ResizingAs-Rigid-As-Possible Shape ManipulationAdap…

自锁设计更稳固,同为科技(TOWE)服务器电脑IEC 60320电源线

说起IEC 60320标准电源线&#xff0c;可能很多人不知道具体是什么东西&#xff0c;但要说到台式电脑电源线&#xff0c;那大家就都能耳熟能详了。IEC 60320电源线的用途十分广泛&#xff0c;包括家用电器、医疗设备、数据中心服务器、商业机械设备、自动化生产线等都是用此类电…

API网关-Apinto压缩包方式自动化安装配置教程

文章目录 前言一、Apinto安装教程1. 复制脚本2. 增加执行权限3. 执行脚本4. Apinto命令4.1 启动Apinto4.2 停止Apinto4.3 重启Apinto4.4 查看Apinto版本信息4.5 加入Apinto集群4.6 离开Apinto集群4.7 查看Apinto节点信息 5. 卸载Apinto 二、Apserver(Apinto Dashboard V3)安装教…

将文件以指定格式存储~BMP~C的实现~FAT32格式

参考&#xff1a; BMP文件学习笔记&#xff08;一&#xff09;&#xff1a; C/C语言实现.bmp文件读写_c 写入bmp-CSDN博客 U盘到底用什么格式好&#xff1f;FAT32、NTFS还是exFAT&#xff1f; - 知乎 (zhihu.com) 第一部分&#xff1a; 位图文件头 BITMAPFILEHEADER&#x…

力扣1027. 最长等差数列

动态规划 思路&#xff1a; 可以参考力扣1218. 最长定差子序列目前不清楚公差&#xff0c;可以将序列最大最小值找到&#xff0c;公差的范围是 [-(max - min), (max - min)]&#xff0c;按公差递增迭代遍历求出最长等差数列&#xff1b; class Solution { public:int longest…

Mybatis-SqlSessionFactory/多数据源

下面的代码演示了发送一个HTTP请求到Controller&#xff0c;如果key“dev”&#xff0c;则查询dev数据库&#xff0c;否则查询默认的数据库 Resourceprivate SqlSessionFactory sqlSessionFactory;Resourceprivate DataSource defaultDataSource;Resourceprivate XXXMapper xxx…

go语言下划线、变量和常量

1、下划线 “_”是特殊标识符&#xff0c;用来忽略结果。 1.1. 下划线在import中 在Golang里&#xff0c;import的作用是导入其他package。import 下划线&#xff08;如&#xff1a;import hello/imp&#xff09;的作用&#xff1a;当导入一个包时&#xff0c;该包下的文件里…

IDEA 创建maven项目没有src

环境&#xff1a; IntelliJ IDEA 2022.3.3 (Ultimate Edition) JDK 17 Windows 11 10.0 Maven 3.9.5 创建maven项目的时候没有src目录 试过网上说的重新配置maven库&#xff0c;增加vm-options&#xff0c;并没有什么用。直到我看见了 正常创建就好了。

[计算机提升] 清理系统盘的前期准备

5.1 清理系统盘的前期准备 5.1.1 系统盘之殇&#xff1a;为什么系统盘会越来越大 在windows系统中&#xff0c;系统盘一般是C盘&#xff0c;随着电脑使用时间变长&#xff0c;系统盘会变得越来越大。而系统盘通常在安装系统时已经固定好了&#xff0c;如果系统盘的剩余空间太…