dijstra(迪杰斯特拉)算法的简单实现
来源:互联网 发布:淘宝儿童家具商品描述 编辑:程序博客网 时间:2024/06/05 23:56
迪杰斯特拉算法的步骤:(所有符号出现在下面的源代码中)
(1)初始时,S只包含源点,即S={v},v的距离dist[v]为0。U包含除v外的其他顶点,U中顶点u距离
dis[u]为边上的权值(若v与u有边) )或∞(若u不是v的出边邻接点即没有边<v,u>)。(2)从U中选取一个距离v(dist[k])最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长
度)。
(3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u(u∈ U)的距离(经过顶点k)比
原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权(即如果
dist[k]+w[k,u]<dist[u],那么把dist[u]更新成更短的距离dist[k]+w[k,u])。
(4)重复步骤(2)和(3)直到所有顶点都包含在S中(要循环n-1次)
/*迪杰特斯拉算法,用临接矩阵存储,采用两层循环时间复杂度为O(n^2)*/#include <stdio.h>#include <stdlib.h>#define MAXLEN 100#define INFINITY 100000int mat[MAXLEN][MAXLEN];void create_matrix(int n,int m){ int i,j; int start,end,dis; /*初始化临接矩阵*/ for(i=0;i<n;i++){ for(j=0;j<n;j++){ mat[i][j] = INFINITY; } } /*输入图节点和边*/ for(i=0;i<m;i++){ printf("请输入起点和终点以及之间的距离:\n"); scanf("%d%d%d",&start,&end,&dis); //--start; //--end; if(start<n&&end<n&&dis<INFINITY){ mat[start][end] = mat[end][start]=dis; }else{ printf("你输入的数据有误\n"); } /*节点自己到自己距离为0*/ //mat[start][start] = mat[end][end] = 0; }}int dijkstra(int (*mat)[MAXLEN],int n,int s,int f){ /*dis为起点到各节点的距离数组,mark表示数组节点是否已经被访问*/ int dis[MAXLEN],mark[MAXLEN]; int path[MAXLEN]; //路径保存 int i,j,k; /*初始化mark,0表示未访问*/ for(i = 0; i< n; i++){ mark[i] = 0; } /*从邻接矩阵获取起点到临接点的距离*/ for(i = 0; i< n; i++){ dis[i] = mat[s][i]; path[i] = s; //所有节点的前一个节点都初始化为开始节点 } /*选中起始节点*/ mark[s] = 1; path[s] = -1;//开始节点的前一个初始化为-1; /*起始节点距离为0*/ dis[s] = 0; /*设置最短距离*/ int min; for(i=0;i<n;i++){ min = INFINITY; /*找出临接点中未被选中的点中距离最短的点*/ for(j=0;j<n;j++){ if((mark[j] == 0) && dis[j] < min ){ min = dis[j]; k = j; } } mark[k] = 1; /*以邻接点位基准,修改剩余节点的距离*/ int temp; for(j=0;j<n;j++){ temp = dis[k]+mat[k][j]; if( (temp < dis[j]) && (mark[j] == 0)){ dis[j] = temp; path[j] = k; //跟新j节点的前一个节点 } } } /*输出路径与距离*/ for(i=0;i<n;i++){ if(dis[i] != INFINITY ){ printf("0~%d : %d :路径:",i,dis[i]); printf("%d ",i); j=path[i]; while(j != -1){ printf("<- %d ",j); j=path[j]; } printf("\n"); } } return dis[f];}int main(){ int n,m; int dis=-1; printf("请输入节点数n和边数m\n"); scanf("%d%d",&n,&m); create_matrix(n,m); dis = dijkstra(mat,n,0,n-1); //printf("dis = %d\n",dis); return 0;}
0 0
- dijstra(迪杰斯特拉)算法的简单实现
- Dijstra的greedy简单实现
- java 实现的Dijstra算法
- Dijstra算法的Python实现
- Dijstra算法 C++实现
- dijstra算法 c语言实现
- Dijstra算法的代码实现及解释(最短路径问题)
- 基于优先队列PriorityQueue的Dijstra算法之Java实现
- 简单实现dijstra算法和floyd算法并打印所有最短路径
- 最短路(Dijstra算法)
- 图论(5)-Dijstra算法
- 最短路(Dijstra算法)
- Dijstra算法实现求解单源最短路径问题
- Dijstra算法
- Dijstra算法
- dijstra算法
- dijstra算法
- Dijstra算法
- I Hate It
- poj 2186 强连通分量个数
- java正则表达式
- 我的第一篇博客
- web.xml 中 classpath 写法说明
- dijstra(迪杰斯特拉)算法的简单实现
- Python生成验证码
- CentOS单独编译安装PHP gd库扩展
- 【POJ2151】【Check the difficulty of problems】
- 不能打开参数文件initORCL.ora解决办法
- Xcode快捷键大全
- web_reg_save_param在飞机订票中的例子
- HDOJ 2094 产生冠军 (拓扑排序)
- spring项目,数据字典信息写入缓存