dijkstra算法
来源:互联网 发布:软件项目设计方案 编辑:程序博客网 时间:2024/06/05 12:43
dijkstra即迪杰斯特拉算法,能够处理无负权值的有向图,无向图中某一点到其他各点最短路的问题。
算法思想和步骤如下:
将原点集合V分为两个集合S,U;S表示已确定最短路的点,U表示尚未确定最短路的点。
S={V0},U=V-S;
用数组T存储V0到其他各个点的最短距离。
第一步:第一次将V0添加到S集合中,利用V0与其他点的距离更新数组T:如果V0不能到达,则记为无穷大,V0能到达,则将权重填入数组T
之后则用新加入到S集合中的点来更新数组T。
第二步:找出T中最小的值,即目前距离V0最短的点(U集合中的),并将该点添加到S集合中。由于该图的权值非负,可以得出很明显的结论:该点到V0的距离不能再短了。
重复上述步骤一直到所有的点都添加到S集合中。
迪杰斯特拉算法的原理通过上面的描述也就很清晰了。
自己写了一份很丑的代码,主要体现思想,懒得改了。
代码示例:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define Max 100int graph[Max][Max]; //邻接矩阵int p,q;int rec[Max][2]; //存储最短路径和是否已访问void init(){ scanf("%d%d",&p,&q); //点数和边数 for(int i=0; i<p; i++) { rec[i][0]=99999; rec[i][1]=1; for(int j=0; j<p; j++) //初始化 graph[i][j]=99999; }}void input(){ int a,b,v; for(int i=1; i<=q; i++) { scanf("%d%d%d",&a,&b,&v); graph[a][b]=v; graph[b][a]=v; }}void dijkstra(){ int com=99999,flag=99999; int pnt=0,cnt=0; int i; rec[pnt][0]=0; while(cnt<p) { cnt++;com=flag=99999; rec[pnt][1]=0; i=pnt; printf("*********%d*********",pnt); for(int j=0; j<p; j++) { if(graph[i][j] == 99999) continue; if(rec[j][1]&&graph[i][j]+rec[i][0]<rec[j][0]) { rec[j][0] = graph[i][j]+rec[i][0]; //if(pnt==6) //printf("////%d////%d\n",j,graph[i][j]); } } for(int j=0; j<p; j++) if(rec[j][1] && rec[j][0]<flag) { flag=rec[j][0]; pnt=j; } for(int j=0; j<p; j++) printf("%d---",rec[j][0]); printf("\n"); }}int main(){ init(); input(); dijkstra(); for(int i=0; i<p; i++) printf("%d\n",rec[i][0]);}
阅读全文
0 0
- Dijkstra算法
- dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra 算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra 算法
- Dijkstra 算法
- dijkstra算法
- Dijkstra 算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- dijkstra算法
- windows核心编程---错误报告与应用程序恢复
- SDUT-3373 数据结构实验之查找一:二叉排序树
- 360行,行行出状元——大数据工程师篇
- spring boot 中spring security使用数据库保存权限
- 字符串处理(UVA10082 )
- dijkstra算法
- 1191: 【蟠桃记】
- 开发闲聊(二)--eclipse工程目录中不显示红叉(代码错误提示)
- DOM的扩展
- github的创建
- tf.image.flip
- 为什么用加权平均来降噪
- python-快速使用urllib爬取网页(小结)
- Spring-涉及到的设计模式汇总