最小生成樹__Prim演算法

何畢之發表於2018-06-19
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;
                    }
                }
            }

        }
    }
}



相關文章