最小生成树-Prim算法和Kruskal算法

原文链接:https://blog.csdn.net/lsgo_myp/article/details/91435589

               

Prim算法

加点法

1.算法简单描述

1).输入:一个加权连通图,其中顶点集合为V,边集合为E;

2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;

3).重复下列操作,直到Vnew = V:

a.在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);

b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;

4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
  
namespace ConsoleApp1
{
    class Program
    {
        //结点初始状态
        static int N = -1;
        //结点已加入状态
        static int Y = 1;
        static void Main(string[] args)
        {          
            //起始点  顶点以0开始 A顶点为0,B为1
            int start = 3;
            //无向图邻接矩阵
            int[,] map = new int[7, 7] {
                {0,7,N,5,N,N,N }, //A顶点的边
                {7,0,8,9,7,N,N }, //B顶点的边
                {N,8,0,N,5,N,N }, //C顶点的边
                {5,9,N,0,N,6,N }, //D顶点的边
                {N,7,5,N,0,8,9 }, //E 顶点的边
                {N,N,N,6,8,0,11 }, //F 顶点的边
                {N,N,N,N,9,11,0 },  //G顶点的边
            };

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
    //已选的点集合
    int[] vNew = new int[map.GetLength(0)];
    //置为初始状态 ,此时未加入任何结点
    for (int i = 0; i < vNew.Length; i++)
    {
        //N代表为加入结点
        vNew[i] = N;
    }
    //加入初始结点
    vNew[start] = Y;
 
    int len = GetMST(vNew, map);
 
    Console.WriteLine("最小生成树权值为:"+len);
    Console.ReadKey();
}
 
/// <summary>
///   普里姆算法
/// </summary>
/// <param name="vNew">已加入的结点,初始值需设定</param>
/// <param name="map">无向图的邻接矩阵</param>
/// <returns></returns>
private static int GetMST(int[] vNew,int[,]map)
{
    //找出vNew点中与未选择的边组成的最小值
    int length = 0;
    while(vNew.Count(temp=>temp==Y)<map.GetLength(0))
    {
        int minLength = int.MaxValue;
        int minNewNode = N;
        int minStartNode = N;
        for (int i = 0; i < vNew.Length; i++)
        {
            if (vNew[i] == Y)
            {
                for (int j = 0; j < map.GetLength(1); j++)
                {
                    //未选择的结点已vNew中的结点组成的边
                    if (vNew[j] == N)
                    {
                        if (map[i, j] != N)
                        {
                            
 
                            if (map[i, j] < minLength)
                            {
                               // Console.WriteLine("边{0}{1}", i, j);
                                minLength = map[i, j];
 
                                minNewNode = j;
                                minStartNode = i;
                            }
 
                        }
 
                    }
                }
            }
 
        }
        if (minNewNode==N)
        {

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
            //此处图的邻接矩阵数据不正确
                    throw new Exception("图的邻接矩阵数据不正确");
                }
                else
                {
                    vNew[minNewNode] = Y;
                    Console.WriteLine("顶点{0}加入", ConvertToChar( minNewNode));
                    Console.WriteLine("边{0}--{1}加入", ConvertToChar(minStartNode), ConvertToChar(minNewNode));
                    length += minLength;
                }
            }
            return length;
        }
  
        /// <summary>
        /// 转换成字符,方便查看
        /// </summary>
        /// <param name="charValue"></param>
        /// <returns></returns>
        private static char ConvertToChar(int charValue)
        {
  
            int k = charValue + 65;
            return (char)k;
        }
    }
}

  

 

Kruskal算法

加边法

posted @   yinghualeihenmei  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2023-03-28 在 HTML 文档中使用 class 属性
2023-03-28 ztree 右键菜单功能
2023-03-28 js树形控件—zTree使用,右键出现菜单
2023-03-28 详解C# List<T>的Contains,Exists,Any,Where性能对比
2023-03-28 Request.url请求路径的一些属性
2023-03-28 C#中虚方法(virtual)详解
2023-03-28 C# override详解
点击右上角即可分享
微信分享提示