C#,最小生成树(MST)克鲁斯卡尔(Kruskal)算法的源代码

一、Kruskal算法简史

克鲁斯卡尔(Kruskal)算法是一种用来寻找最小生成树的算法,由Joseph Kruskal在1956年发表。用来解决同样问题的还有Prim算法和Boruvka算法等。三种算法都是贪婪算法的应用。和Boruvka算法不同的地方是,Kruskal算法在图中存在相同权值的边时也有效。

二、Kruskal算法思路


(1)记Graph中有v个顶点,e个边;
(2)新建图,拥有原图中相同的e个顶点,但没有边;
(3)将原图中所有e个边按权值从小到大排序;
(4)循环:从权值最小的边开始遍历每条边,直至图中所有的节点都在同一个连通分量中。
如果这条边连接的两个节点于图中不在同一个连通分量中,添加这条边到图中。如此反复。

三、Kruskal算法的源代码

核心代码:

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

namespace Legalsoft.Truffer.Algorithm
{
	public class Subset
	{
		public int Parent { get; set; } = 0;
		public int Rank { get; set; } = 0;
	}

	/// <summary>
	/// 最小生成树 Kruskal 算法
	/// </summary>
	public static class MST_Kruskal_Algorithm
	{
		private static int Find(Subset[] subsets, int i)
		{
			if (subsets[i].Parent != i)
			{
				subsets[i].Parent = Find(subsets, subsets[i].Parent);
			}
			return subsets[i].Parent;
		}

		private static void Union(Subset[] subsets, int x, int y)
		{
			int xroot = Find(subsets, x);
			int yroot = Find(subsets, y);

            if (subsets[xroot].Rank < subsets[yroot].Rank)
			{
				subsets[xroot].Parent = yroot;
			}
			else if (subsets[xroot].Rank > subsets[yroot].Rank)
			{
				subsets[yroot].Parent = xroot;
			}
			else
			{
				subsets[yroot].Parent = xroot;
				subsets[xroot].Rank++;
			}
		}

		public static int Execute(Undirected_Graph graph, out List<WeightEdge> tree)
		{
			tree = new List<WeightEdge>();
			int Vertex_Number = graph.Vertex_Number;

			WeightEdge[] result = new WeightEdge[Vertex_Number];
			int e = 0;
			int i = 0;
			for (i = 0; i < Vertex_Number; ++i)
			{
				result[i] = new WeightEdge();
			}

			graph.EdgeArray.Sort(delegate(WeightEdge a, WeightEdge b) { 
				return a.CompareTo(b); 
			});

			Subset[] subsets = new Subset[Vertex_Number];
			for (i = 0; i < Vertex_Number; ++i)
			{
				subsets[i] = new Subset();
			}

			for (int v = 0; v < Vertex_Number; ++v)
			{
				subsets[v].Parent = v;
				subsets[v].Rank = 0;
			}

			i = 0;
			while (e < (Vertex_Number - 1))
			{
				WeightEdge next_edge = graph.EdgeArray[i++];

				int x = Find(subsets, next_edge.Start);
				int y = Find(subsets, next_edge.End);

				if (x != y)
				{
					result[e++] = next_edge;
					Union(subsets, x, y);
				}
			}

			int minimumCost = 0;
			for (i = 0; i < e; ++i)
			{
				tree.Add(new WeightEdge(result[i].Start,result[i].End, result[i].Weight));
				minimumCost += result[i].Weight;
			}
			return minimumCost;
		}
	}
}

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

POWER BY 315SOFT.COM &
TRUFFER.CN

相关推荐

  1. python 算法算法

    2024-01-24 06:38:01       58 阅读
  2. 普里姆(prim)和(Kruskal)

    2024-01-24 06:38:01       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-24 06:38:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-24 06:38:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-24 06:38:01       82 阅读
  4. Python语言-面向对象

    2024-01-24 06:38:01       91 阅读

热门阅读

  1. STL-stack and queue

    2024-01-24 06:38:01       56 阅读
  2. 【issue-halcon例程学习】edge_segments.hdev

    2024-01-24 06:38:01       62 阅读
  3. DPlayer m3u8 视频禁止下载

    2024-01-24 06:38:01       51 阅读
  4. Redis

    Redis

    2024-01-24 06:38:01      42 阅读
  5. 压缩字符串 实现思路及练习题

    2024-01-24 06:38:01       54 阅读
  6. 网络安全的介绍

    2024-01-24 06:38:01       60 阅读