Dijkstra算法用来寻找图的结点间最短路径,通常是指定一个起始结点后,寻找从该结点出发,到达各个结点的最短路径。该算法是有关最短路径问题的一个算法。由Dijkstra于1959年提出。

百度百科:Dijkstra算法。

维基百科:Dijkstra's Algorithm。

参考链接Dijkstra算法的C语言程序。

程序说明:图存储在二维数组中,即邻接矩阵中。使用s集合和vs集合辅助Dijkstra算法的过程,开始时将指定的开始结点放入s集合中,其他剩余的结点放入vs集合中,从s集合到vs集合的边中找出一个代价最小的边,然后将相关的结点从vs集合取出放入s集合,指定所有结点都在s集合为止。

中间结果和最后结果放在数组dist[]中。

C语言程序:

/* Dijkstra算法程序 */#define MAX_INT (int)((unsigned)(-1) >> 1)
#define MIN(x, y) ((x)>(y))?(y):(x)#define TRUE 1
#define FALSE 0#include <stdio.h>//假设有N个节点其中包含1个源点,N-1个终点求源点到其他节点的最短路径
#define  N 6int a[N][N];
int dist[N];
int prev[N];
int s_set[N], s_count;
int vs_set[N], vs_count;void createMatrix();
void init(int s);
void dijkstra();int main(void)
{int i, j, s;createMatrix();for(i=0; i<N; i++) {for(j=0; j<N; j++)printf("%4d", a[i][j]);printf("\n");}printf("start node:");scanf("%d", &s);if(s>=0 && s<=N-1) {init(s);} elseprintf("input error!\n");printf("first distance:\n");for(i=0; i<N; i++)printf("%12d", dist[i]);printf("\n");dijkstra();printf("result distance:\n");for(i=0; i<N; i++)printf("%4d ", dist[i]);printf("\n");printf("result previous:\n");for(i=0; i<N; i++)printf("%4d ", prev[i]);printf("\n");return 0;
}void dijkstra()
{int i, j, minval, pm;for(;;) {if(vs_count == 0)return;minval=MAX_INT;for(i=0; i<N; i++) {if(vs_set[i]) {minval = MIN(minval, dist[i]);if(minval == dist[i])pm = i;}}s_set[pm] = TRUE;s_count++;vs_set[pm] = FALSE;vs_count--;for(i=0; i<N; i++)if(s_set[i])for(j=0; j<N; j++)if(vs_set[j] && a[i][j]!=-1) {int temp = MIN(dist[j], dist[i]+a[i][j]);if(temp < dist[j]) {dist[j] = temp;prev[j] = i;}}}
}//创建邻接矩阵
void createMatrix()
{int i, j;for(i=0; i<N; i++)for(j=0; j<N; j++)if(i==j)a[i][j] = 0;elsea[i][j] = -1;FILE *fp;fp = fopen("d1.txt", "r");for(;;) {int val;fscanf(fp, "%d%d%d", &i, & j, &val);if(i == -1)break;a[i][j] = val;}fclose(fp);
}void init(int s)
{int i;for(i=0; i<N; i++)dist[i] = (a[s][i]==-1)?MAX_INT:a[s][i];for(i=0; i<N; i++)prev[i] = s;for(i=0; i<N; i++) {s_set[i] = FALSE;vs_set[i] = TRUE;}s_set[s] = TRUE;s_count = 1;vs_set[s] = FALSE;vs_count = N-1;
}

输入数据(文件):

0 2 10
0 1 50
0 4 70
1 2 15
1 4 10
2 0 20
2 3 15
3 1 20
3 4 35
4 3 30
5 3 3
-1 -1 -1

输出结果:

   0  50  10  -1  70  -1-1   0  15  -1  10  -120  -1   0  15  -1  -1-1  20  -1   0  35  -1-1  -1  -1  30   0  -1-1  -1  -1   3  -1   0
start node:1
first distance:2147483647           0          15  2147483647          10  2147483647
result distance:35    0   15   30   10 2147483647
result previous:2    1    1    2    1    1 

Dijkstra算法的C语言程序相关推荐

  1. Prim算法的C语言程序

    Prim算法是有关图的最小生成树的算法.1957年由美国计算机科学家罗伯特·普里姆(Robert C. Prim)独立发现. 百度百科:Prim算法. 维基百科:Prim's Algorithm. 参 ...

  2. c语言滤出是个最小值,经典滤波算法及C语言程序

    <经典滤波算法及C语言程序>由会员分享,可在线阅读,更多相关<经典滤波算法及C语言程序(9页珍藏版)>请在人人文库网上搜索. 1.经典的滤波算法经典的滤波算法 可以用用可以用用 ...

  3. 小型温控系统c语言程序,pid算法温度控制c语言程序 - 全文

    温度控制PID自整定原理介绍 整定PID(三模式)控制器 整定温度控制器涉及设置比例.积分和微分值,以得到对特定过 程的可能的最佳控制.如果控制器不包含自动整定算法,或者自 动整定算法未提供适合特定应 ...

  4. c语言单源最短路径问题实验报告,单源最短路径问题Dijkstra算法的c语言实现

    求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值 ...

  5. Kruskal算法的C语言程序

    Kruskal算法是有关图的最小生成树的算法.Kruskal算法是两个经典的最小生成树算法之一,另外一个是Prim算法. 程序来源:Kruskal's Algorithm. 百度百科:Kruskal算 ...

  6. Kruskal算法的C++语言程序

    Kruskal算法是有关图的最小生成树的算法.Kruskal算法是两个经典的最小生成树算法之一,另外一个是Prim算法. 程序来源:Minimum Spanning Tree using Krushk ...

  7. Dijkstra算法(C语言)

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

  8. 最短路径之dijkstra算法的C语言实现

    Dijkstra算法解决的是单源最短路径问题:对于给定的有向网络G=(V,E)及单个源点v,求从v到G的其余各顶点的最短路径. 本文以下面的有向网络(用邻接矩阵存储)为例,并假设源点为1. 源程序如下 ...

  9. 算法分支定界法C语言程序,常用算法大全-分枝定界

    任何美好的事情都有结束的时候.现在我们学习的是本书的最后一章.幸运的是,本章用到的大部分概念在前面各章中已作了介绍.类似于回溯法,分枝定界法在搜索解空间时,也经常使用树形结构来组织解空间(常用的树结构 ...

最新文章

  1. Linux下ssh登录速度慢的解决办法
  2. c# unchecked关键字。byte 合并short
  3. why different people have different digital response?
  4. 文件上传下载-修改文件上传大小
  5. [转载] 大道至简:软件工程实践者的思想——第十章 是思考还是思想
  6. 多线程编程反模式_编程反模式
  7. springdata jpa单表操作crud
  8. Android日志[基础篇]Android Log日志输出
  9. Linux通过进程号查询占用的端口
  10. 静态与实例变量的区别——(面试题)
  11. matlab 非线性方程组画图,使用matlab进行非线性方程组求解
  12. sshd启动报错解决:sshd re-exec requires execution with an absolute path
  13. 《Adobe After Effects CS5经典教程》——1.6 预览
  14. 132.Function Handing 函数
  15. Android获取所在城市坐标及城市信息(逆地理位置编码)
  16. 如何在阿里云上购买域名并备案Iot studio
  17. 交流电桥———实验原理
  18. 中国移动、联动、电信
  19. 字符串、列表、字典、元组的基本操作
  20. Python基础之基本结构

热门文章

  1. 手机格斗网游该如何避免延迟
  2. 600个开源iOS应用库
  3. 用C#读取数码相片的EXIF信息(一)
  4. C# 多个图片叠加,图片透明.
  5. element ui 菜单封装_vue模块化(echart+element ui)
  6. 5.3.1 同步发生
  7. school_vue操作记录
  8. 大数据可视化dataease(有所帮助)
  9. 详解:Sqoop的导入和导出数据
  10. 【HIVE 之 DDL,DML】