迪杰斯特拉算法(C语言实现)

如上图,求以a为源点到个顶点的最短路劲。

#include "stdio.h"
#include "stdlib.h"
//用一个最大数表示顶点之间不相关
#define MAX 999
//设置顶点个数
#define MAX_VERTEX_NUM 7
//表示顶点之间不关联的常量
int INFINITY = MAX;
//记录顶点是否被访问过,已访问值为1,未访问值为0
int final[MAX_VERTEX_NUM];
//从指定顶点到其他各个节点的最短路径
int dist[MAX_VERTEX_NUM];
//记录路径
char path[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
//实现构造图的矩阵关系,在图初始化的时候赋值到G.arcs[][]中
int temp[MAX_VERTEX_NUM][MAX_VERTEX_NUM]={
{ 0, 24, 8, 15,MAX,MAX,MAX},
{MAX, 0,MAX,MAX, 6,MAX,MAX},
{MAX,MAX, 0,MAX, 7, 3,MAX},
{MAX,MAX,MAX, 0,MAX,MAX, 4},
{MAX,MAX,MAX,MAX, 0,MAX, 9},
{MAX,MAX,MAX, 5, 2, 0, 10},
{MAX, 3,MAX,MAX,MAX,MAX, 0}
};
//图中顶点关系的二维数组表示
typedef struct ArcCell{
int adj;
char *info;
}AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
//图的结构体,vexs顶点的一维数组
//AdjMatrix类型的关系矩阵,vexnum为顶点个数,arcnum为关系个数。
typedef struct{
char vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum;
int arcnum;
}MGraph;
//初始化图,依次初始化顶点为abc...
//然后把实现已构造temp[][]矩阵赋值到图的G.arcs[][]矩阵关系中
MGraph initMGraph(MGraph G)
{
int i,j;
char char_a='a';
//依次构建顶点为a,b,c...
for(i=0;i<MAX_VERTEX_NUM;i++)
{
G.vexs[i]=(char)((int)char_a+i);
printf("%c ",G.vexs[i]);
}
printf("\n");
//G.arcs[][]=temp[][]
for(i=0;i<MAX_VERTEX_NUM;i++)
{
for(j=0;j<MAX_VERTEX_NUM;j++)
{
G.arcs[i][j].adj=temp[i][j];
printf("%3d ",G.arcs[i][j].adj);
}
printf("\n");
}
G.vexnum=7;
G.arcnum=12;
return G;
}
//判定指定顶点到各顶点中路径最小的
//需要去除已经访问的顶点final[i]!=1再做最小路径比较
//返回下标
int mininum(int* dist)
{
int i,min=MAX,min_i;
for(i=0;i<MAX_VERTEX_NUM;i++)
{
if(dist[i]!=0&&dist[i]<min&&final[i]!=1)
{
min=dist[i];
min_i=i;
}
}
if(min==MAX)
return -1;
return min_i;
}
//顶点是否在图中
int exist_v(MGraph G,char u)
{
int i,s=-1;
for(i=0;i<G.vexnum;i++)
if(G.vexs[i]==u)
s=i;
if(s==-1)
return 0;
return 1; 
}
//图最小路径算法
void ShortestPath_DIJ(MGraph G,char u)
{
int s=-1,i,j,k,min_i,path_p,count,c;
char v;
//查找源点的下标,用s记录
for(i=0;i<G.vexnum;i++)
if(G.vexs[i]==u)
s=i;
for(i=0;i<G.vexnum;i++)
{
final[i]=0;
dist[i]=G.arcs[s][i].adj;
v=G.vexs[i];
if(dist[i]<INFINITY&&dist[i]!=0)
{
path[i][0]=u;
path[i][1]=v;
printf("init path%d=%c-%c-\n",i,path[i][0],path[i][1]);
}
}
//初始化从源点到源点的路径为0,把源点设置为已访问(也就是把源点加入到S中)
dist[s]=0;
final[s]=1;
for(i=1;i<G.vexnum;i++)
{
min_i=mininum(dist);
printf("\nmin_i=%d ",min_i);
printf("\tvisited index---");
for(c=0;c<G.vexnum;c++)
if(final[c]==1)
printf("%d ",c);                      
//当前中间点与图中任何顶点都不关联
if(min_i==-1)
break;
final[min_i]=1;
//更新其他顶点最短路径
for(k=0;k<G.vexnum;k++)
{
if(G.arcs[min_i][k].adj!=0)
{
//更新路劲值,路径表示(如a-b-c)
if((dist[min_i]+G.arcs[min_i][k].adj)<dist[k])
{  
dist[k]=dist[min_i]+G.arcs[min_i][k].adj;
for(path_p=0;path[min_i][path_p]!=0;path_p++)
path[k][path_p]=path[min_i][path_p];
path[k][path_p]=G.vexs[k];
}
}
}
//输出执行一次后的dist[]最短路径情况
printf("\n----------------------------------------------------\n");
for(count=0;count<G.vexnum;count++)
{
if(dist[count]==MAX)
printf("\tMAX");
else
printf("\t%3d ",dist[count]);
}
//输出路径表示
printf("\n---------the--------------path----------------------");
for(count=0;count<G.vexnum;count++)
{
printf("\npath%d=",count);
for(j=0;j<G.vexnum;j++)
if(path[count][j]&&path[count][j]!=path[count][j-1])
printf("%c-",path[count][j]);
}
}
int main(void)
{
int i,j;
char v;
MGraph G;
//初始化图
G=initMGraph(G);
//计算最短路径
v='a';
if(exist_v(G,v))
ShortestPath_DIJ(G,v);
else
printf("the vertex %c has no path",v);
system("pause");
return 0;
}

转载于:https://blog.51cto.com/gelivable/427022

迪杰斯特拉算法(C语言实现)相关推荐

  1. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc

    图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题*/ //算法实现: #include #include #define MAX 2 ...

  2. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言)

    图的邻接表实现迪杰斯特拉算法(C语言). 迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题. 图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是 ...

  3. 迪杰斯特拉算法c语言要点,C语言迪杰斯特拉实现最短路径算法要点.doc

    C语言迪杰斯特拉实现最短路径算法要点.doc 数据结构课程设计报告 ----旅游咨询系统设计 目录 一.需求分析- 2 - 二.系统分析- 2 - 三.概要设计- 3 - 一.系统划分- 3 - 二. ...

  4. 迪杰斯特拉算法c语言6,C语言迪杰斯特拉实现最短路径算法.doc

    数据结构课程设计报告 ----旅游咨询系统设计 目录 一.需求分析- 2 - 二.系统分析- 2 - 三.概要设计- 3 - 一.系统划分- 3 - 二.邻接矩阵建立流程图:- 3 - 三.迪杰斯特拉 ...

  5. 图的最短路径--迪杰斯特拉算法 c语言

    还是按照书上的例子: 完整代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #def ...

  6. 最短路径迪杰斯特拉算法 c语言,Dijkstra第K最短路径算法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //运筹学之最短路径 #include #include #define M 99999 int main() { int G[100][100]; in ...

  7. 校园导游系统_C语言实现_Dijkstra(迪杰斯特拉算法)_数据结构

    西京学院导游系统 摘要   要完成对整个导游图系统的功能实现,需要对每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现和需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确 ...

  8. c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法

    迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本 ...

  9. C语言开发东北大学活力长者社区班车路线管理(迪杰斯特拉算法)

    东北大学大作业-活力长者社区-班车路线管理(创新) 开发语言:c语言 编译工具:vscode 引用的小伙伴麻烦点下关注,有任何疑问欢迎大家留言哎 1.运行效果 2.迪杰斯特拉算法实现思路 为了求得两站 ...

最新文章

  1. 想学单片机怎么入手?学单片机前先学什么?
  2. SQL2000 N' '的意思
  3. 原创 | 初学者友好!最全算法学习资源汇总(附链接)
  4. windows窗体(winform)中嵌入显示Excel工作表。
  5. ORACLE中科学计数法显示问题的解决
  6. DoD模型与OSI模型的关系及其协议对应关系
  7. java 签名 ecdsa_Java实现ECDSA签名算法
  8. CyberArk:被忽略的特权账号管理已进入蓝海
  9. 给缺少Python项目实战经验的人,赶紧收藏!
  10. Nature Milestones | 近20年人类癌症研究领域14项里程碑式进展!
  11. popwindow 加个边框_利用popupwindow生成带有列表的对话框,并设置对话框列表的点击事件...
  12. python 数据结构包括三方面_python数据结构
  13. mybatis java sql_mybatis java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax;
  14. 物联网卡对企业设备的重要性
  15. 双轴按键摇杆控制器控制TFTLCD(使用ADC1双通道DMA传输)
  16. Kubernetes基础篇:主要特性、基本概念与总体架构
  17. HttpWatch工具简介及使用技巧 (转自:卖烧烤的鱼)
  18. 爬虫 一些爬取图片时出现的错误
  19. 神级操作丨用 Python 将微信热文转换成Word文档
  20. 福昕PDF开启多实例

热门文章

  1. UITextField长度限制的写法
  2. Kong Api 网关使用 docker 部署
  3. TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗
  4. 退信之550 5.7.1 Unable to relay for *@*.com
  5. 京东方剑指物联网领域
  6. 第二十天:规划风险应对
  7. 配置Exchange OWA和Sharepoint网站单点登录
  8. #天天复制,今天写一个# 把文字转为图片
  9. Pascal's Triangle
  10. C# 3.0 —— 扩展方法