基于贪心法的单源最短路径算法
(1)最短路径问题具有最优子结构性质,即最短路径的子路径仍然是最短路径
(2)最短路径问题具有贪心选择性质,为了求的最短路径,Dijkstra提出以最短路径长度递增,逐次生成最短路径的算法
图的ADT以及实现详见:基于相邻矩阵实现图的ADT
Dijkstra算法代码:
1 int minVertex(Graphm* g,int *D){ 2 int i,v; 3 for(int i=0;i<g->n();i++){ 4 if(g->getMark(i)==0){ 5 v=i;break; 6 } 7 } 8 for(i++;i<g->n();i++){ 9 if(g->getMark(i)==0&&(D[i]<D[v]))v=i; 10 } 11 return v; 12 } 13 void Dijkstra(Graphm*g,int *D,int s){ 14 int i,v,w; 15 for(int i=0;i<g->n();i++){ 16 D[i]=INFINITY; 17 } 18 D[s]=0; 19 for(int i=0;i<g->n();i++){ 20 v=minVertex(g,D); 21 if(D[v]==INFINITY)return ; 22 g->setMark(v,1); 23 for(w=g->first(v);w<g->n();w=g->next(v,w)){ 24 if(D[w]>(D[v]+g->getEdge(v,w))) 25 D[w]=D[v]+g->getEdge(v,w); 26 } 27 } 28 }
性能分析:
通过扫描整个包含|V|个元素的表来搜索最小值
cost:O(|V|^2+|E|)=O(|V|^2)
Dijkstra算法只适合非负权值的图
原文地址:https://www.cnblogs.com/bo2000/p/10124041.html
时间: 2024-10-14 22:35:31