【C# dijkstra迪杰斯特拉算法 最短路径】迪杰斯特拉算法 最短路径的C#实现
作者:cuihao0532
转载请注明出处:http://www.cnblogs.com/cuish/archive/2013/06/09/3129106.html
适用于有向图和无向图,邻接矩阵存储方式
1 //graph:邻接矩阵形式存储的有向图或无向图
2 //nLength:点的个数
3 //nStart:起点在邻接矩阵中的位置
4 //nEnd:终点在邻接矩阵中的位置
5 //INFINITY: 表示没有路径的最大值
6 //返回值:保存最短路径正确顺序的int数组,数组中只有一个起点时说明没有路径
7 //D[]数组保存起点到各个点的最短路径长度
8 //需要注意的是:由于在代码有中min + graph[nEnd, w]这样的操作,因此最大值的选取要注意
9
10
11 public static int[] dijkstra(int[,] graph, int nLength, int nStart, int nEnd, INT INFINITY )
12 {
13 int t = nEnd;
14 int[] P = new int[nLength];
15 int[] D = net int [nLength];
16 int[] final = new int[nLength];
17
18 for(int i = 0; i < nLength; ++ i)
19 {
20 D[i] = graph[nStart, i];
21 P[i] = nStart;
22 final[i] = 0;
23
24 } //for
25
26 final[nStart] = 1;
27
28 for(int i = 1;i < nLength; ++ i)
29 {
30 int min = INFINITY; //最大值
31 for(int w = 0; w < nLength; ++ w)
32 {
33 if(final[w] == 0 && D[w] < min)
34 {
35 nEnd = w;
36 min = D[w];
37 }
38 } //for
39
40 final[nEnd] = 1;
41
42 for(int w = 0; w < nLength; ++ w)
43 {
44 if(final[w] == 0 && (min + graph[nEnd, w] < D[w]))
45 {
46 D[w] = min + graph[nEnd, w];
47 P[w] = nEnd;
48 }//if
49
50 } //for
51
52 } //for
53
54 string r = null;
55 if(D[t] < INFINITY)
56 {
57 r = t.ToString() + ","; //最短路径上的第一个点为本身(后面要把这个顺序逆置)
58 }
59
60 do
61 {
62 r += P[t].ToString() + ","; //找所有的路径上的点;
63 t = P[t];
64 }while(t != nStart);
65
66 char[] arr = r.ToCharArray();
67 Array.Reverse(arr); //逆置
68
69 string strRet = new string(arr); //逆置后的string
70
71 string[] str = strRet.Split(new char[] {','}); //按逗号分割
72 int [] nArrResult = new int[str.Length - 1]; //第一个为空,减少一个
73
74 for(int count = 1; count < str.Length; ++ count)
75 {
76 nArrResult[count - 1] = int.Parse(str[count]);
77 }
78
79 return nArrResult;
80
81
82 }
**********************技术交流请 email:cuihao0532#163.com 欢迎转载,转载请注明出处!***************************** 如果对本文满意请扫描文章左侧【二维码添加微信】获取更多好玩、有趣、有益、有营养的料,
你我共同成长!Y(^_^)Y
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗