千家信息网

Dijkstra算法求最短路径问题完整C代码怎么写

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,Dijkstra算法求最短路径问题完整C代码怎么写,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。算法基本思想和过程单源最短路径问题,即在
千家信息网最后更新 2026年11月01日Dijkstra算法求最短路径问题完整C代码怎么写

Dijkstra算法求最短路径问题完整C代码怎么写,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

算法基本思想和过程

单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。

一.最短路径的最优子结构性质

该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。

假设P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,则有P(i,j)=P(i,k)+P(k,s)+P(s,j)。而P(k,s)不是从k到s的最短距离,那么必定存在另一条从k到s的最短路径P'(k,s),那么P'(i,j)=P(i,k)+P'(k,s)+P(s,j)

二.Dijkstra算法

由上述性质可知,如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点。那么(Vi...Vk)也必定是从i到k的最短路径。为了求出最短路径,Dijkstra就提出了以最短路径长度递增,逐次生成最短路径的算法。譬如对于源顶点V0,首先选择其直接相邻的顶点中长度最短的顶点Vi,那么当前已知可得从V0到达Vj顶点的最短距离dist[j]=min{dist[j],dist[i]+matrix[i][j]}。根据这种思路,

假设存在G=,源顶点为V0,U={V0},dist[i]记录V0到i的最短距离,path[i]记录从V0到i路径上的i前面的一个顶点。

1.从V-U中选择使dist[i]值最小的顶点i,将i加入到U中;

2.更新与i直接相邻顶点的dist值。(dist[j]=min{dist[j],dist[i]+matrix[i][j]})

3.直到U=V,停止。

完整C代码

/* Dijkstra算法求图的最短路径问题C代码 */#include #include #include #define MaxSize 20#define INFINITY 65535typedef char VertexType; //定义图 的邻接矩阵表示法结构typedef struct Graph {        VertexType ver[MaxSize+1];        int edg[MaxSize][MaxSize];}Graph;//邻接矩阵法图的生成函数void CreateGraph( Graph *g ){        int i = 0;        int j = 0;        int VertexNum;        VertexType Ver;        printf("请输入图的顶点:\n");        while( '\n' != (Ver=getchar()) )                g->ver[i++] = Ver;        g->ver[i] = '\0';        VertexNum = strlen(g->ver);        printf("请输入相应的的邻接矩阵:\n");        for( i=0; iedg[i][j]);}//打印图的结点标识符和邻接矩阵void PrintGraph( Graph g ){        int i, j;        int VertexNum = strlen(g.ver);        printf("图的顶点为:\n");        for( i=0; iedg[i][j] )                                g->edg[i][j] = INFINITY;}//Dijkstra求最短路径函数void Dijkstra( Graph g ){        int VertexNum = CalVerNum( g );        int j;        int mini;        int index = 0;        int *used = (int *)malloc(sizeof(int)*VertexNum);        int *distance = (int *)malloc(sizeof(int)*VertexNum);        int *parent = (int *)malloc(sizeof(int)*VertexNum);        int *last = (int *)malloc(sizeof(int)*VertexNum);        SetWeight( &g );                                  //设置权值        for( int i=0; i distance[j] + g.edg[j][k]) ) {   //由于有顶点新加入U集合,对距离数组distance进行更新,比较原路径长度与以新加入的顶点为中间点的路径长度                                distance[k] = distance[j] + g.edg[j][k];                        }                parent[index++] = j;        }        printf("%c到%c的最短路径经过顶点依次为:\n", g.ver[0], g.ver[VertexNum-1]);        for( i=0; i

测试数据及结果


看完上述内容,你们掌握Dijkstra算法求最短路径问题完整C代码怎么写的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

顶点 问题 算法 矩阵 路径 长度 代码 性质 短距离 结构 内容 函数 方法 更多 结构性 优子 求出 更新 生成 输入 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司经营范围 互联网科技行业发展 互联网金融与金融科技 互联网 的科技创新 互联网未来科技 壕鑫互联网络科技 碳银互联网科技有限公司 互联网科技博客 华脉科技工业互联网产品 互联网 科技馆 天速互联网络科技有限公司 广州慧亚互联网科技怎么样 互联网科技大奖都有哪些公司 银川新华互联网科技学校联系电话 浙南科技城互联网大厦建设工程 浙南科技城互联网大厦招聘 唯美互联网科技 同城互联网络科技 知域互联网科技有限公司官网 利用互联网等科技手段 中国互联网科技工作委员会毛军 互联网金融 科技 互联网科技实习生岗位职责 广州恒生互联网科技有限 浙江互联网科技研学营 西安小鹰速贷互联网科技有限公司 众安科技工业互联网合作 银川新华互联网科技学校原画 优雇互联网科技有限公司 广东猫王互联网科技有限公司电话
0