【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 }

 

 

 

转载于:https://my.oschina.net/u/926461/blog/350876

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
迪杰斯特拉算法是一种用于计算图中单源最短路径的贪心算法。它的主要思想是从起点开始,逐步扩展到其他节点,直到到达终点或者所有节点都被扩展。在扩展的过程中,维护一个距离数组,记录起点到每个节点的最短距离,同时维护一个集合,记录已经找到最短路径的节点。每次从未找到最短路径的节点中选择距离起点最近的节点进行扩展,更新距离数组中的距离值。重复这个过程,直到到达终点或者所有节点都被扩展。 以下是一个使用迪杰斯特拉算法求解最短路径的Python代码示例: ```python import heapq def dijkstra(graph, start, end): # 初始化距离数组和已找到最短路径的节点集合 dist = {node: float('inf') for node in graph} dist[start] = 0 visited = set() # 使用堆优化的Dijkstra算法 heap = [(0, start)] while heap: (d, node) = heapq.heappop(heap) if node in visited: continue visited.add(node) if node == end: return d for neighbor, cost in graph[node].items(): if neighbor in visited: continue new_dist = dist[node] + cost if new_dist < dist[neighbor]: dist[neighbor] = new_dist heapq.heappush(heap, (new_dist, neighbor)) # 如果无法到达终点,返回None return None # 示例图 graph = { 'A': {'B': 5, 'C': 1}, 'B': {'A': 5, 'C': 2, 'D': 1}, 'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8}, 'D': {'B': 1, 'C': 4, 'E': 3, 'F': 6}, 'E': {'C': 8, 'D': 3}, 'F': {'D': 6} } # 求解A到F的最短路径 print(dijkstra(graph, 'A', 'F')) # 输出:8 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值