Dijkstra算法的C语言程序
Dijkstra算法用来寻找图的结点间最短路径,通常是指定一个起始结点后,寻找从该结点出发,到达各个结点的最短路径。该算法是有关最短路径问题的一个算法。由Dijkstra于1959年提出。
百度百科:Dijkstra算法。
维基百科:Dijkstra's Algorithm。
参考链接:Dijkstra算法的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语言程序相关推荐
- Prim算法的C语言程序
Prim算法是有关图的最小生成树的算法.1957年由美国计算机科学家罗伯特·普里姆(Robert C. Prim)独立发现. 百度百科:Prim算法. 维基百科:Prim's Algorithm. 参 ...
- c语言滤出是个最小值,经典滤波算法及C语言程序
<经典滤波算法及C语言程序>由会员分享,可在线阅读,更多相关<经典滤波算法及C语言程序(9页珍藏版)>请在人人文库网上搜索. 1.经典的滤波算法经典的滤波算法 可以用用可以用用 ...
- 小型温控系统c语言程序,pid算法温度控制c语言程序 - 全文
温度控制PID自整定原理介绍 整定PID(三模式)控制器 整定温度控制器涉及设置比例.积分和微分值,以得到对特定过 程的可能的最佳控制.如果控制器不包含自动整定算法,或者自 动整定算法未提供适合特定应 ...
- c语言单源最短路径问题实验报告,单源最短路径问题Dijkstra算法的c语言实现
求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值 ...
- Kruskal算法的C语言程序
Kruskal算法是有关图的最小生成树的算法.Kruskal算法是两个经典的最小生成树算法之一,另外一个是Prim算法. 程序来源:Kruskal's Algorithm. 百度百科:Kruskal算 ...
- Kruskal算法的C++语言程序
Kruskal算法是有关图的最小生成树的算法.Kruskal算法是两个经典的最小生成树算法之一,另外一个是Prim算法. 程序来源:Minimum Spanning Tree using Krushk ...
- Dijkstra算法(C语言)
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...
- 最短路径之dijkstra算法的C语言实现
Dijkstra算法解决的是单源最短路径问题:对于给定的有向网络G=(V,E)及单个源点v,求从v到G的其余各顶点的最短路径. 本文以下面的有向网络(用邻接矩阵存储)为例,并假设源点为1. 源程序如下 ...
- 算法分支定界法C语言程序,常用算法大全-分枝定界
任何美好的事情都有结束的时候.现在我们学习的是本书的最后一章.幸运的是,本章用到的大部分概念在前面各章中已作了介绍.类似于回溯法,分枝定界法在搜索解空间时,也经常使用树形结构来组织解空间(常用的树结构 ...
最新文章
- Linux下ssh登录速度慢的解决办法
- c# unchecked关键字。byte 合并short
- why different people have different digital response?
- 文件上传下载-修改文件上传大小
- [转载] 大道至简:软件工程实践者的思想——第十章 是思考还是思想
- 多线程编程反模式_编程反模式
- springdata jpa单表操作crud
- Android日志[基础篇]Android Log日志输出
- Linux通过进程号查询占用的端口
- 静态与实例变量的区别——(面试题)
- matlab 非线性方程组画图,使用matlab进行非线性方程组求解
- sshd启动报错解决:sshd re-exec requires execution with an absolute path
- 《Adobe After Effects CS5经典教程》——1.6 预览
- 132.Function Handing 函数
- Android获取所在城市坐标及城市信息(逆地理位置编码)
- 如何在阿里云上购买域名并备案Iot studio
- 交流电桥———实验原理
- 中国移动、联动、电信
- 字符串、列表、字典、元组的基本操作
- Python基础之基本结构