【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 }
复制代码

 

 

 

posted on   崔好好  阅读(2997)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗

导航

< 2013年6月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 1 2 3 4 5 6
点击右上角即可分享
微信分享提示