Dijkstra最短路徑算法(C#實現)

      學習了最短路勁算法,就想用C#語言實現一下,算本身的總結提升,也爲初學者提供幫助閒話不說,首先陳述一下dijkstra算法的思想算法

一、設置一個集合S,用來存放肯定了最短路徑的頂點,一個集合U,用來存放沒有肯定最短路徑的頂點,一個集合distance,表示起點到該點在此刻的最短距離,數組

集合pre,表示該點取到當前路徑時的上一個參考點,初始參考點下標都爲0;集合Isfor表示是否肯定已經爲最短路徑了。學習

2.先把起點V0的下標0加到集合S,而後標記Isfor[0]=true;把起點的下標標記爲把V1,V2,V3,V4,V5,V6的下標123456放到U中,遍歷集合U,把0到各個頂點的距離添加到distance中(沒有直接相連的邊,就用2048這個大數表示);ui

3.遍歷distance,找到最小的距離,把頂點的下標添加到S中,而後設置該下標對應的Isfor的值爲true,找到該下標爲起點到各邊的距離,若是這個新起點到其他在U集合的頂點的距離和上一個起點到新起點的距離之和<distance數據的距離,就把該位置的distance值設爲(這個新起點到其他在U集合的頂點的距離和上一個起點到新起點的距離之和);而後更改該頂點的對應pre的參考下標,爲上一個起點的下標;而後重複3;spa

附上代碼:blog

using System;
using System.Collections;
using System.Text;
namespace DijkstraMethod
{
class Program
{
//V1到V7的鄰接矩陣
static int[,] Metro = new int[7,7] {
{ 0, 3, 7, 5,2048,2048,2048},
{ 3, 0, 2,2048, 6,2048,2048},
{ 7, 2, 0, 3, 3,2048,2048},
{ 5,2048, 3, 0,2048, 2, 8},
{2048, 6, 3,2048, 0,2048, 2},
{2048,2048,2048, 2,2048, 0, 2},
{2048,2048,2048, 8, 2, 2, 0}};
static int row = 7;
ArrayList S = new ArrayList(row);//S儲存肯定最短路徑的頂點的下標
ArrayList U = new ArrayList(row);//U中存儲還沒有肯定路徑的頂點的下標
int[] distance = new int[7];//用以每次查詢存放數據
int[] prev = new int[7];//用以存儲前一個最近頂點的下標
bool[] Isfor = new bool[7] { false, false, false, false, false, false, false };
/// <summary>
/// dijkstra算法的實現部分
/// </summary>
/// <param name="Start"></param>
void FindWay(int Start)
{
S.Add(Start);
Isfor[Start] = true;
for(int i=0;i<row;i++)
{
if(i!=Start)
U.Add(i);
}
for(int i=0;i<row;i++){
distance[i] = Metro[Start, i];
prev[i] = 0;
}
int Count = U.Count;
while(Count>0)
{
int min_index = (int)U[0];//假設U中第一個數存儲的是最小的數的下標
foreach(int r in U)
{
if (distance[r] < distance[min_index]&&!Isfor[r])
min_index = r;
}
S.Add(min_index);//S加入這個最近的點
Isfor[min_index]=true;
U.Remove(min_index);//U中移除這個點;
foreach(int r in U)
{
//查找下一行鄰接矩陣,如何距離和上一個起點的距離和與數組存儲的相比比較小,就更改新的距離和起始點,再比對新的起點到各邊的距離
if (distance[r] > distance[min_index] + Metro[min_index, r])
{
distance[r] = distance[min_index] + Metro[min_index, r];
prev[r] = min_index;
}
else
{
distance[r] = distance[r];
}
}
Count = U.Count;
}
}
/// <summary>
/// 把生成數據顯示出來
/// </summary>
void display()
{
for(int i=0;i<row;i++)
{
Console.Write("V1到V{0}的最短路徑爲→V1",i);
int prePoint = prev[i];
string s = "";
StringBuilder sb = new StringBuilder(10);
while (prePoint> 0)
{
s =( prePoint + 1)+s;
prePoint = prev[prePoint];
}
for (int j = 0; j < s.Length;j++ )
{
sb.Append("-V").Append(s[j]);
}
Console.Write(sb.ToString());
Console.Write("-V{0}", i );
Console.WriteLine(":{0}",distance[i]);string

}
}
static void Main(string[] args)
{
Program p = new Program();
p.FindWay(0);
p.display();
Console.ReadKey();
}
}
}it

相關文章
相關標籤/搜索