最短路徑之Dijkstra演算法
using System;
namespace Dijkstra演算法
{
class Program
{
public static readonly int M = -1;//表示不可到達距離
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 }
};//路徑圖
static int places = (int)Math.Sqrt(map.Length);//獲取地點數;
static int[] shortest = new int[places]; //存放從start到其他節點的最短路徑
static Boolean[] visited = new Boolean[places]; //標記當前該頂點的最短路徑是否已經求出,true表示已經求出
static string[] path = new string[places];//記錄路徑
static int[] map2 = new int[places];//記錄A的連線情況
static void Main(string[] args)
{
DisplayMap();
Console.WriteLine();
Console.WriteLine();
int start = 0; //起始點
for (int i = 0; i < places; i++)
map2[i] = map[0, i];
dijkstra_alg(start);
if (shortest == null)
{
return;
}
for (int i = 0; i < places; i++)
{
string res = displayResult(i);
res=res.Replace("--","-");
if (res[res.Length - 1] == '-')
res = res.Remove(res.Length - 1);
Console.WriteLine(res + " ; 最短距離為:" + shortest[i]);
}
Console.ReadKey();
}
/// <summary>
/// 輸出路徑
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public static string displayResult(int index)
{
string str = path[index];
int num = (int)Enum.Parse(typeof(Place), (str.Replace("-", "")[0]).ToString());
if (map2[index] != M)
return path[num] + str.Remove(0, 1);
else
return displayResult(num) + str.Remove(0, 1);
}
/// <summary>
/// 表示A-E六個地點
/// </summary>
public enum Place
{
A = 0,
B = 1,
C = 2,
D = 3,
E = 4,
F = 5
}
/// <summary>
/// 將原矩陣顯示
/// </summary>
public static void DisplayMap()
{
Console.Write(" ");
for (int i = 0; i < places; i++)
{
Console.Write((Place)i + " ");
}
Console.Write("\r\n");
for (int i = 0; i < places; i++)
{
Console.Write((Place)i + " ");
for (int j = 0; j < places; j++)
{
if (map[i, j] < 0)
Console.Write(map[i, j] + " ");
else
Console.Write(map[i, j] + " ");
}
Console.Write("\r\n");
}
}
private static void dijkstra_alg(int start)
{
//初始化源點到其他各個地點的最短路徑長度
for (int i = 0; i < places; i++)
{
shortest[i] = map[start, i];
visited[i] = false;
//如果和起點相鄰則新增路徑
if (map[start, i] != M)
path[i] = "A" + '-';
}
// TODO Auto-generated method stub
// 初始化,第一個頂點求出
shortest[start] = 0;
visited[start] = true;
for (int count = 0; count != places - 1; count++)
{
//選出一個距離初始頂點最近的為標記頂點
int k = start;
int min = M;
for (int i = 0; i < places; i++)//遍歷每一個頂點
{
if (!visited[i] && map[start, i] != M) //如果該頂點未被遍歷過且與start相連
{
if (min == M || min > map[start, i]) //找到與start最近的點
{
min = map[start, i];
k = i;
//新增路徑
if (path[i] != null)
if (path[i].IndexOf(((Place)i).ToString()) < 0)
path[i] += (Place)i + "-";
else { }
else
path[i] = (Place)i + "-";
}
}
}
//正確的圖生成的矩陣不可能出現K== M的情況
if (k == M)
{
Console.WriteLine("the input map matrix is wrong!");
return;
}
shortest[k] = min;
visited[k] = true;
//以k為中心點,更新start到未訪問點的距離
for (int i = 0; i < places; i++)
{
if (!visited[i] && map[k, i] != M)
{
int callen = min + map[k, i];
if (map[start, i] == M || map[start, i] > callen)
{
//新增或者更新路徑
if (path[i] != null)
if (path[i].IndexOf(((Place)i).ToString()) > 0)
path[i] = path[i].Remove(path[i].Length - 3, 2);
path[i] += (Place)k + "-" + (Place)i + "-";
//更新最短距離
map[start, i] = callen;
}
}
}
}
}
}
}
相關文章
- 最短路徑問題 (dijkstra演算法)演算法
- 單源最短路徑-Dijkstra演算法演算法
- python實現Dijkstra演算法之 最短路徑問題Python演算法
- 0016:單源最短路徑(dijkstra演算法)演算法
- 最短路徑——Dijkstra演算法和Floyd演算法演算法
- 最短路徑(dijkstra 與 Floyd)
- 7-1 最短路徑之Dijkstra (10分)
- 最短路演算法之:Dijkstra 演算法演算法
- 最短路徑—Dijkstra(迪傑斯特拉)演算法演算法
- 最短路徑——dijkstra演算法程式碼(c語言)演算法C語言
- 圖的最短路徑(Dijkstra | Floyd)
- 最短路之Dijkstra
- [最短路徑問題]Dijkstra演算法(含還原具體路徑)演算法
- 最短路dijkstra演算法演算法
- 最短路 - Dijkstra 演算法演算法
- 最短路徑--dijkstra演算法、弗洛伊德(Floyd)演算法(帶路徑輸出)演算法
- 一篇文章講透Dijkstra最短路徑演算法演算法
- 路徑規劃演算法 - 求解最短路徑 - Dijkstra(迪傑斯特拉)演算法演算法
- Python 圖_系列之縱橫對比 Bellman-Ford 和 Dijkstra 最短路徑演算法Python演算法
- 最短路徑之Floyd演算法演算法
- dijkstra最短路演算法模板(雙源)演算法
- 10行實現最短路演算法——Dijkstra演算法
- 最短路徑演算法演算法
- 最短路-樸素版Dijkstra演算法&堆優化版的Dijkstra演算法優化
- Djikstra最短路徑演算法演算法
- 最短路徑(Dijskra演算法)JS演算法
- 最短路徑(Floyd演算法)演算法
- 圖論-Dijkstra最短路圖論
- 資料結構------最短路徑Dijkstra和最小生成樹Prim資料結構
- 一個人的旅行 (dijkstra演算法求最短路)演算法
- 如何在 Java 中實現 Dijkstra 最短路演算法Java演算法
- [MATLAB]最短路徑Floyd演算法Matlab演算法
- 最短路徑演算法總結演算法
- POJ2387 Til the Cows Come Home【最短路 Dijkstra演算法】演算法
- 演算法與資料結構之-圖的最短路徑演算法資料結構
- 幾個最短路徑的演算法演算法
- Floyd演算法(計算最短路徑)演算法
- 多源最短路徑演算法:Floyd演算法演算法