最短路径问题-Dijkstra(基于图的ADT)
Posted bo2000
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径问题-Dijkstra(基于图的ADT)相关的知识,希望对你有一定的参考价值。
基于贪心法的单源最短路径算法
(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算法只适合非负权值的图
以上是关于最短路径问题-Dijkstra(基于图的ADT)的主要内容,如果未能解决你的问题,请参考以下文章