程序员必须掌握的十种算法---Dijkstra算法
2015-08-18 10:36
676 查看
由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出的使用了广度优先搜索解决非负权有向图的单源最短路径问题。
#include<stdio.h> int main() { /* *e存储图的矩阵表示 *dis存储1号顶点到其余各个顶点的距离 *book表示各个顶点是否已经找到最小距离 */ int e[10][10],dis[10],book[10],i,j,n,m,t1,t2,t3,u,v,min; int inf=99999999;//用inf(infinity)存储一个我们认为的正无穷的值 //读入n,m,n表示顶点个数,m表示边的条数 scanf("%d %d",&n,&m); //初始化 for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i==j) e[i][j]=0; else e[i][j]=inf; } } //读入边 for(i=1;i<=n;i++) { scanf("%d %d %d",&t1,&t2,&t3); e[t1][t2]=t3; } //初始化dis数组,这里是1号顶点到其余各个顶点的初始化路程 for(i=1;i<=n;i++) dis[i]=e[1][i]; //book数组初始化 for(i=1;i<=n;i++) book[i]=0; book[1]=1; //Dijkstra算法的核心语句 for(i=1;i<=n-1;i++) { //找到离1号顶点最近的顶点 min=inf; for(j=1;j<=n;j++) { if(book[j]==0&&dis[j]<min) { min=dis[j];//min存储这个最小的距离 u=j;//u表示最近的顶点是哪个顶点 } } book[u]=1; for(v=1;v<=n;v++) { //查看顶点u到顶点v是否连通 if(e[u][v]<inf) { if(dis[v]>dis[u]+e[u][v]) dis[v]=dis[u]+e[u][v]; } } } //输出最终结果 for(i=1;i<=n;i++) { printf("%d ",dis[i]); } getchar(); return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例