最短路径之dijkstra算法的C语言实现
Dijkstra算法解决的是单源最短路径问题:对于给定的有向网络G=(V,E)及单个源点v,求从v到G的其余各顶点的最短路径。
本文以下面的有向网络(用邻接矩阵存储)为例,并假设源点为1。
源程序如下:
#include<stdio.h>
#define maxsize 1000 //表示两点间不可达,距离为无穷远
#define n 7 //结点的数目
void dijkstra(int C[][n],int v);//求原点v到其余顶点的最短路径及其长度
void main()
{
printf(" ——Dijkstra算法——\n");
int C[n][n]={
{maxsize,13,8,maxsize,30,maxsize,32},
{maxsize,maxsize,maxsize,maxsize,maxsize,9,7},
{maxsize,maxsize,maxsize,5,maxsize,maxsize,maxsize},
{maxsize,maxsize,maxsize,maxsize,6,maxsize,maxsize},
{maxsize,maxsize,maxsize,maxsize,maxsize,2,maxsize},
{maxsize,maxsize,maxsize,maxsize,maxsize,maxsize,17},
{maxsize,maxsize,maxsize,maxsize,maxsize,maxsize,maxsize}
},v=1,i,j;
printf("【打印有向图的邻接矩阵】\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("\t%d",C[i][j]);
}
printf("\n");
}
printf("【打印原点1到其他各点的最短路径及其长度】\n");
dijkstra(C,v);
}
void dijkstra(int C[][n],int v)//求原点v到其余顶点的最短路径及其长度
//C为有向网络的带权邻接矩阵
{
int D[n];
int P[n],S[n];
int i,j,k,v1,pre;
int min,max=maxsize,inf=1200;
v1=v-1;
for(i=0;i<n;i++)
{
D[i]=C[v1][i]; //置初始距离值
if(D[i]!=max)
P[i]=v;
else
P[i]=0;
}
for(i=0;i<n;i++)
S[i]=0; //红点集S开始为空
S[v1]=1;D[v1]=0; //开始点v送S
for(i=0;i<n-1;i++) //扩充红点集
{
min=inf;//令inf>max,保证距离值为max的蓝点能扩充到S中
for(j=0;j<n;j++)//在当前蓝点中选距离值最小的点k+1
{
if((!S[j])&&(D[j]<min))
{
min=D[j];
k=j;
}
}
S[k]=1; //将k+1加入红点集
for(j=0;j<n;j++)
{
if((!S[j])&&(D[j]>D[k]+C[k][j]))//调整各蓝点的距离值
{
D[j]=D[k]+C[k][j]; //修改蓝点j+1的距离
P[j]=k+1; //k+1是j+1的前趋
}
}
} //所有顶点均已扩充到S中
for(i=0;i<n;i++)
{
printf("%d到%d的最短距离为",v,i+1);
printf("%d\n",D[i]); //打印结果
pre=P[i];
printf("路径:%d",i+1);
while(pre!=0) //继续找前趋顶点
{
printf("<——%d",pre);
pre=P[pre-1];
}
printf("\n");
}
}
转载自http://blog.sina.com.cn/s/blog_686d0fb001012qze.html @月之幽境
转载于:https://www.cnblogs.com/tryitboy/p/4231168.html
最短路径之dijkstra算法的C语言实现相关推荐
- c语言单源最短路径问题实验报告,单源最短路径问题Dijkstra算法的c语言实现
求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值 ...
- Dijkstra算法的C语言程序
Dijkstra算法用来寻找图的结点间最短路径,通常是指定一个起始结点后,寻找从该结点出发,到达各个结点的最短路径.该算法是有关最短路径问题的一个算法.由Dijkstra于1959年提出. 百度百科: ...
- 最短路径的Dijkstra算法(邻接表)
原文:http://blog.csdn.net/axiqia/article/details/50984464 描述 以邻接表作为存储结构实现,求解从给定源点到给定结束点的最短路径. 输入 从1开始表 ...
- 图的单源最短路径:Dijkstra算法实现
本文介绍的是图的非负权值的单源最短路径问题.问题的提出是,对于有权图D,t提供源点v,要找到从v到其他所有点的最短路径,即单源最短路径问题,在本文中,解决这一问题,是普遍比较熟悉的Dijkstra算法 ...
- 数据结构——最短路径之Dijkstra算法(与最小生成树的prime算法很像,建议一起看)
最短路径之Dijkstra算法 (一)Dijkstra算法 单源最短路径:就是从某一个顶点出发,到图中任意顶点之间的最短路径: [算法概述]:Dijkstra算法适用于解决单源最短路径的问题.即:从源 ...
- dijkstra算法PHP,单源最短路径(dijkstra算法)php实现
做一个医学项目,其中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路如下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么(Vi ...
- 最短路径之Dijkstra算法
今天看了最短路径之Dijkstra算法,对这算法,写上自己的心得和感悟! 1.Dijkstra算法,(迪杰斯特拉)--单源最短路径 求的是一个源点到其他顶点的最短路径 算法描述 1).算法思想 设G= ...
- 最短路径问题——Dijkstra算法详解(单源最短路径)
单源最短路径 单源最短路径,是指从图中任一点出发到其他各点之间的最短路径. Dijkstra算法介绍 Dijkstra算法又称迪杰特斯拉算法,dijkstra算法的核心思想是将全部结点所在集合V分成两 ...
- 最短路径(Dijkstra算法),一文必看懂最短路径的方法
最短路径问题(Dijkstra算法) 从图中的某一个顶点出发到达另一个顶点的所经过的边的权重和最小的一条路径,称为最短路径. Dijkstra算法适用于求一个节点到其他节点的最短路径,主要特点是通过广 ...
最新文章
- 学习笔记TF065:TensorFlowOnSpark
- 列表推导式 python原理_Python进阶-列表推导式详解总结
- java闭合数据_java多线程中线程封闭详解
- 数据结构与算法之美-目录
- 流 java_java8——使用流
- cordova打包app后发请求出现 Provisional headers are shown的问题
- reactjs组件的生命周期函数:getDerivedStateFromProps
- [转载]spring security 的 logout 功能
- 【Redis】13.Redis服务器配置redis.conf
- mysql并发参数查看_MySQL Innodb 并发涉及参数
- javac与java版本不一致
- poj -- 1042 Gone Fishing(枚举+贪心)
- [IOS]NSUserDefaults读取和写入
- 漏洞挖掘之通达OA2017任意文件上传(漏洞已失效)
- catia怎么添加毛坯_CATIA教程
- Python数据分析练习(一)(餐厅订单分析meal_order_detail)
- edge下载网络问题无法下载
- C++计算三角形周长和面积
- 利用C++实现简单的文件加密
- TPS的几种计算方式
热门文章
- 使用机器视觉模式识别屏幕
- rtmp服务器 协议之同步
- 95-10-132-启动-TransactionCoordinator-源码
- 【ES】分布式调度系统之 Elastic-Job-Lite
- 【Spring】Spring NoSuchMethodError okhttp3.internal.platform.Platform.log(ILjava/lang/String;Ljava/lan
- kylin: build cube Hbase: Region Server 意外退出
- spark学习-35-Spark的Map任务输出跟踪器MapOutputTracker
- python中__init__导入失败_python - 如何使用__init__.py修复“在非包中尝试相对导入”...
- linux线程计算,有关Linux进程与线程数目计算的问题
- Redis问的太深入,面试官说:“你先回去等通知吧“!