Dijkstra演算法——C#實現版
阿新 • • 發佈:2019-01-27
using System.Text; using System.Collections; using System; namespace Greedy { class Marx { private int[] distance; private int row; private ArrayList ways = new ArrayList(); public Marx(int n,params int[] d) { this.row = n; distance = new int[row * row]; for (int i = 0; i < row * row; i++) { this.distance[i] = d[i]; } for (int i = 0; i < this.row; i++) //有row個點,則從中心到各點的路有row-1條 { ArrayList w = new ArrayList(); int j = 0; w.Add(j); ways.Add(w); } } //------------------------------ public void Find_way() { ArrayList S = new ArrayList(1); ArrayList Sr = new ArrayList(1); int[] Indexof_distance = new int[this.row]; for (int i = 0; i < row; i++) { Indexof_distance[i] = i; } S.Add(Indexof_distance[0]); for (int i = 0; i < this.row; i++) { Sr.Add(Indexof_distance[i]); } Sr.RemoveAt(0); int[] D = new int[this.row]; //存放中心點到每個點的距離 //---------------以上已經初始化了,S和Sr(裡邊放的都是點的編號)------------------ int Count = this.row - 1; while (Count > 0) { //假定中心點的編號是0的貪吃法求路徑 for (int i = 0; i < row; i++) D[i] = this.distance[i]; int min_num = (int)Sr[0]; //距中心點的最小距離點編號 foreach (int s in Sr) { if (D[s] < D[min_num]) min_num = s; } //以上可以排序優化 S.Add(min_num); Sr.Remove(min_num); //-----------把最新包含進來的點也加到路徑中------------- ((ArrayList)ways[min_num]).Add(min_num); //----------------------------------------------- foreach (int element in Sr) { int position = element * (this.row) + min_num; bool exchange = false; //有交換標誌 if (D[element] < D[min_num] + this.distance[position]) D[element] = D[element]; else { D[element] = this.distance[position] + D[min_num]; exchange = true; } //修改距離矩陣 this.distance[element] = D[element]; position = element * this.row; this.distance[position] = D[element]; //修改路徑--------------- if (exchange == true) { ((ArrayList)ways[element]).Clear(); foreach (int point in (ArrayList)ways[min_num]) ((ArrayList)ways[element]).Add(point); } } --Count; } } public void Display() { //------中心到各點的最短路徑---------- Console.WriteLine("中心到各點的最短路徑如下: \n\n"); int sum_d_index = 0; foreach(ArrayList mother in ways) { foreach (int child in mother) Console.Write("V{0} -- ", child+1); Console.WriteLine(" 路徑長 {0}",distance[sum_d_index++]); } } } class MainEnterPoint { static void Main(string[] args) { int r; //列數 Console.Write("請輸入點個數(含配送中心點): "); Int32.TryParse(Console.ReadLine(), out r); Console.WriteLine("各點分別為: \n"); for (int i = 0; i < r; i++) Console.Write("V{0} ", i); Console.Write(" 假定第一個點是配送中心"); Console.WriteLine("\n\n輸入各點之間的距離(無通徑的用個大整數表示)\n"); int[] a = new int[r * r]; int da; for (int i = 0; i < r; i++) { for (int j = i + 1; j < r; j++) { Console.Write("V{0} 到 V{1}的距離是: ",i,j); Int32.TryParse(Console.ReadLine(), out da); a[i * r + j] = da; Console.WriteLine(); } } //----完善距離矩陣(距離矩陣其實可以是個上三角矩陣, //----但為了處理方便,還是將其完整成一個對稱陣)----------- for (int i = 0; i < r; i++) { for (int j = 0; j < r; j++) { if (i == j) { a[i * r + j] = 0; } a[j * r + i] = a[i * r + j]; } } Marx m=new Marx(r,a); Console.WriteLine(); m.Find_way(); m.Display(); } } }