1 class Program
2 {
3 const int u = 10000;
4
5 static void Main(string[] args)
6 {
7 Console.WriteLine("各点距离矩阵如下:");
8 Console.WriteLine(" A B C D E");
9 Console.WriteLine("A 0 2 3 / /");
10 Console.WriteLine("B 2 0 3 5 2");
11 Console.WriteLine("C 3 3 0 2 4");
12 Console.WriteLine("D / 5 2 0 1");
13 Console.WriteLine("E / 2 4 1 0");
14 int[,] matrix = new int[5, 5] { { 0, 2, 3, u, u }, { 2, 0, 3, 5, 2 }, { 3, 3, 0, 2, 4 }, { u, 5, 2, 0, 1 }, { u, 2, 4, 1, 0 } };
15 while (true)
16 {
17 Console.WriteLine("请输入要计算的起始点:");
18 string a = Console.ReadLine();
19 int start;
20 switch (a.ToLower())
21 {
22 default:
23 case "a":
24 start = 0;
25 break;
26 case "b":
27 start = 1;
28 break;
29 case "c":
30 start = 2;
31 break;
32 case "d":
33 start = 3;
34 break;
35 case "e":
36 start = 4;
37 break;
38 }
39 var list = Dijkstra(matrix, start);
40
41 for (int i = 0; i < list.Count; i++)
42 {
43 Console.WriteLine("从" + a.ToUpper() + "出发到" + i.IndexToChar() + "的最短距离为:" + list[i].Distance + ",最短路径为:" + list[i].Path);
44 }
45 }
46 }
47
48 public static List Dijkstra(int[,] matrix, int start)
49 {
50 int n = matrix.GetLength(0);
51 int[] visited = new int[n];
52 var list = new List();
53
54 for (int i = 0; i < n; i++)
55 {
56 list.Add(new ShortPath() { Index = i, Name = start.IndexToChar() + "->" + i.IndexToChar(), Path = start.IndexToChar() + "->" + i.IndexToChar(), Distance = 0 });
57 }
58 visited[start] = 1;
59 for (int i = 1; i < n; i++)
60 {
61 int k = -1;
62 int dmin = u;
63 for (int j = 0; j < n; j++)
64 {
65 if (visited[j] == 0 && matrix[start, j] < dmin)
66 {
67 dmin = matrix[start, j];
68 k = j;
69 }
70 }
71
72 list[k].Distance = dmin;
73
74 visited[k] = 1;
75 for (int j = 0; j < n; j++)
76 {
77 if (visited[j] == 0 && matrix[start, k] + matrix[k, j] < matrix[start, j])
78 {
79 matrix[start, j] = matrix[start, k] + matrix[k, j];
80 list[j].Path = list[k].Path + "->" + j.IndexToChar();
81 }
82 }
83 }
84
85 return list;
86 }
87 }
88
89 public static class Common
90 {
91 ///
92 /// 索引转换字母
93 ///
94 /// 当前索引
95 /// 起始索引 默认0
96 ///
97 public static char IndexToChar(this int index, int startIndex = 0)
98 {
99 return (char)('A' + index - startIndex);
100 }
101 }
102
103 public class ShortPath
104 {
105 private int index;
106 private string name;
107 private string path;
108 private int distance;
109
110 public string Path { get => path; set => path = value; }
111 public int Distance { get => distance; set => distance = value; }
112 public string Name { get => name; set => name = value; }
113 public int Index { get => index; set => index = value; }
114 }