图论——单源最短路径算法之Dijkstra算法
来源:互联网 发布:软件系统试运行方案 编辑:程序博客网 时间:2024/06/05 20:07
简单的实现了Dijkstra,不考虑效率问题。
注释:V表示图的顶点集合,S表示从源节点到集合中的顶点的最终最短路径已经确定的点的集合
Dijkstra算法的精髓就是
1)初始的时候源节点s到其他所有节点的距离都是无穷大。
2)将源节点加入到集合S,然后又该源节点发射出去所有边中,也就是所有能达到的节点,修改源节点s到这些节点的距离(这个就是算法的核心Relax操作)。
3)找出最短的距离的节点k,将该节点加入到S集合中,并且重复2)操作。直到所有节点被处理过了。
简要的说明一下Relax的作用。
程序中用DIS[u]来表示当前情况下源节点s到u的最短距离。那么对于一条边 u->v 而已,如果DIS[v] > DIS[u] + Weight(u,v), 那么就说明s点到v点最短距离可以更改为从s到u然后在到v。
原理可以参考《算法导论》在这里不详细说明了!
#include <iostream>#include <limits>using namespace std;const int N = 5;enum Color{ White, Gray, Black};struct DEdge{ int start; int end; int weight;};int COST[N][N] = {{0 ,10 ,INT_MAX,5 ,INT_MAX}, {INT_MAX,0 ,1 ,INT_MAX,2 }, {INT_MAX,INT_MAX,0 ,INT_MAX,4 }, {INT_MAX,3 ,9 ,0 ,2 }, {7 ,INT_MAX,6 ,INT_MAX,0 }};int PARENT[N];int DIS[N];Color COLOR[N];void dijkstra_init(int source){ for(int i = 0 ; i < N ; ++i){ DIS[i] = INT_MAX; COLOR[i] = White; PARENT[i] = -1; } DIS[source] = 0; COLOR[source] = Gray;}int findMinDist(){ int min = INT_MAX; int pos = -1; for(int i = 0 ; i < N; ++i) if(COLOR[i]!=Black && min > DIS[i]){ min = DIS[i]; pos = i; } return pos;}void relax(int u, int v){ if(INT_MAX!= COST[u][v]){ if(DIS[v] > DIS[u]+COST[u][v]){ DIS[v] = DIS[u] + COST[u][v]; cout<<"set "<<v<<"="<<DIS[v]<<" through "<<u<<endl; PARENT[v] = u; } } for(int i = 0 ; i < N; ++i) cout<<PARENT[i]<<' '; cout<<endl;}void dijkstra(int source){ if(source>N) return; dijkstra_init(source); int count=0; while(count<N){ int pos = findMinDist(); COLOR[pos] = Gray; cout<<pos<<endl; for(int i = 0; i < N; ++i) relax(pos, i); ++count; COLOR[pos] = Black; } for(int i = 0 ; i < N; ++i){ int pos = i; cout<<pos; while(PARENT[pos]!=-1){ cout<<"<-"<<PARENT[pos]; pos = PARENT[pos]; } cout<<endl; }} int main(){ dijkstra(0); system("PAUSE"); return 0;}
- 图论——单源最短路径算法之Dijkstra算法
- 单源最短路径之Dijkstra算法
- 单源最短路径之Dijkstra算法
- 单源最短路径之dijkstra算法
- 求最短路径之——Dijkstra算法
- 【算法导论】单源最短路径之Dijkstra算法
- 算法——单源最短路径:Bellman-Ford算法、Dijkstra算法
- 通俗算法讲解之图最短路径——Dijkstra算法
- 贪心算法——单源最短路径 dijkstra
- 贪心算法——单源最短路径 dijkstra
- 单源最短路径问题——Dijkstra算法
- 单源最短路径——Dijkstra算法
- 单源最短路径——Dijkstra算法
- Dijkstra算法——单源最短路径
- 单源最短路径——Dijkstra算法
- 单源最短路径—Dijkstra算法(C++)
- Dijkstra算法-单源最短路径—C
- 单源最短路径 dijkstra算法
- 埋藏
- 程序员建色情帝国 每天13亿点击
- 循环队列
- WINCE-MFC-CDC使用出现的4KB内存泄露解决办法,坑爹的MFC
- 谷歌较劲阿里云:重新发明的轮子惹麻烦
- 图论——单源最短路径算法之Dijkstra算法
- 互斥量的使用,是应用程序只运行一次
- Asp.net 第二课 9/18 get和post的区别
- 如何看穿面试官的心理
- js的对象属性的两种访问方式和对象的内存理解
- IE被曝严重漏洞 专家建议更换
- 启动tomcat无法访问http://localhost:8080/的解决方案
- poj2031 - Building a Space Station
- 借我一生