最小生成树__Prim算法

using System;

namespace 最小生成树__Prim算法
{
    class Program
    {
        public static readonly int M = 999999;//表示不可到达距离
        static int[,] map = new int[,] {
                { 0, 6, 3, M,M,M },
                { 6, 0, 2, 5,M,M },
                { 3, 2, 0, 3, 4, M },
                { M, 5, 3, 0, 2, 3 },
                { M,M, 4, 2, 0, 5 },
                { M,M,M, 3, 5, 0 }
            };//路径图  
        public static readonly int N = (int)Math.Sqrt(map.Length);//获取地点数; 
        static bool[] visited = new bool[N];//节点是否被访问
        static int[] closest = new int[N];//记录上一个节点位置
        static int[] lowcost = new int[N];//记录上一个节点与当前节点的权值
        static readonly int start = 0;//开始顶点

        static void Main(string[] args)
        {
            Prim();
            string str1 = "closest 里的值为:";
            string str2 = "lowcost 里的值为:";
            int sum = 0;
            for (int i = 0; i < N; i++)
            {
                str1 += closest[i] + "   ";
                str2 += lowcost[i] + "   ";
                sum += lowcost[i];
            }
            Console.WriteLine(str1);
            Console.WriteLine(str2);
            Console.WriteLine("最小权重和为:" + sum);
            Console.ReadKey();
        }

        static void Prim()
        {
            visited[start] = true;//初始化,集合U只有一个元素,即start
            for (int i = 0; i < N; i++)
            {
                if (i != start)//出start意外所有元素
                {
                    lowcost[i] = map[start, i];//start到其他边的权值
                    closest[i] = start;//设置改点的最临近点为start
                    visited[i] = false;//初始化除start以外其他元素不属于U集合
                }
                else
                    lowcost[i] = 0;
            }

            for (int i = 0; i < N; i++)
            {
                int temp = M;
                int t = start;
                for (int j = 0; j < N; j++)//在集合V-U中寻找距离集合U最近的顶点t
                {
                    if ((!visited[j]) && (lowcost[j] < temp))
                    {
                        t = j;
                        temp = lowcost[j];
                    }
                }
                if (t == start)
                    break;
                visited[t] = true;
                for (int j = 0; j < N; j++)
                {
                    if ((!visited[j]) && (map[t, j] < lowcost[j]))
                    {
                        lowcost[j] = map[t, j];
                        closest[j] = t;
                    }
                }
            }

        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值