C语言实现迪杰斯特拉算法详解
创作时间:
作者:
@小白创作中心
C语言实现迪杰斯特拉算法详解
引用
CSDN
1.
https://blog.csdn.net/ZGUIZ/article/details/54645019
迪杰斯特拉算法(Dijkstra算法)是用于求解图中单源最短路径的经典算法。它广泛应用于网络路由、地图导航等领域。本文将通过C语言实现,详细讲解迪杰斯特拉算法的原理和实现步骤。
1. 数据结构定义
首先,我们需要定义一些基本的数据结构和常量:
#define OK 1
#define ERROR 0
#define MVNum 100
#define Max_Int 32726
typedef int Status;
typedef int ArcType;
typedef char VerTexType;
typedef struct{
VerTexType vex[MVNum];
ArcType arc[MVNum][MVNum];
int vexnum, arcnum;
}AMGraph;
这里定义了一个邻接矩阵表示的图结构AMGraph,其中vex数组存储顶点信息,arc数组存储边的权值,vexnum和arcnum分别表示顶点数和边数。
2. 全局变量声明
我们还需要两个全局变量来辅助算法的实现:
int Path[MVNum];
ArcType D[MVNum];
Path[]用于记录到达每个顶点的上一个顶点。D[]用于记录从源点到每个顶点的最短路径的权值。
3. 图的创建函数
接下来是创建有向图的函数:
int LocateVex(AMGraph *G, VerTexType v)
{
int i;
for (i = 0; i < G->vexnum; i++)
{
if (G->vex[i] == v)
return i;
}
return -1;
}
Status CreateUDN(AMGraph *G)
{
VerTexType v1, v2;
ArcType w;
int i, j, k;
printf("输入总节点数、总边数:");
scanf("%d %d", &G->vexnum, &G->arcnum);
printf("输入节点的值:");
fflush(stdin);
for (i = 0; i < G->vexnum; i++)
{
scanf("%c", &G->vex[i]);
}
for (i = 0; i < G->vexnum; i++)
for (j = 0; j < G->vexnum; j++)
{
G->arc[i][j] = Max_Int;
}
for (k = 0; k < G->arcnum; k++)
{
fflush(stdin);
printf("依次输入边的两个顶点以及边的权值:");
scanf("%c %c %d", &v1, &v2, &w);
i = LocateVex(G, v1);
j = LocateVex(G, v2);
G->arc[i][j] = w;
}
return OK;
}
这个函数首先读取图的顶点数和边数,然后依次读取每个顶点的值,初始化邻接矩阵,并读取每条边的两个顶点和权值。
4. 迪杰斯特拉算法实现
核心算法实现如下:
void ShortestPath_DIJ(AMGraph G, int v0)
{
int min, i, w, v;
bool S[MVNum];
for (v = 0; v < G.vexnum; v++)
{
S[v] = false;
D[v] = G.arc[v0][v];
if (D[v] < Max_Int)
Path[v] = 0;
else
Path[v] = -1;
}
S[v0] = true;
D[v0] = 0;
for (i = 1; i < G.vexnum; i++)
{
min = Max_Int;
for (w = 0; w < G.vexnum; w++)
{
if (!S[w] && min>D[w])
{
v = w;
min = D[w];
}
}
S[v] = true;
for (w = 0; w < G.vexnum; w++)
{
if (!S[w] && D[w]>D[v] + G.arc[v][w])
{
D[w] = D[v] + G.arc[v][w];
Path[w] = v;
}
}
}
}
算法的主要步骤包括:
- 初始化:将所有顶点标记为未访问,将源点到其他顶点的初始距离设置为邻接矩阵中的值,如果存在边则设置为边的权值,否则设置为无穷大。
- 选择当前未访问顶点中距离源点最近的顶点,标记为已访问。
- 更新从源点到其他未访问顶点的距离,如果通过当前顶点可以得到更短的路径,则更新距离和路径信息。
- 重复步骤2和3,直到所有顶点都被访问。
5. 主函数
最后是主函数的实现:
int main(void)
{
int i, j;
AMGraph G;
CreateUDN(&G);
ShortestPath_DIJ(G, 0);
for (i = 1; i < G.vexnum; i++)
{
if (D[i] == Max_Int)
printf("0无法到达%c\n", G.vex[i]);
else
printf("0到%c的权值为:%d\n", G.vex[i], D[i]);
}
return 0;
}
主函数首先创建图,然后调用迪杰斯特拉算法计算从顶点0到其他所有顶点的最短路径,并输出结果。
总结
迪杰斯特拉算法通过维护一个已确定最短路径的顶点集合和一个未确定最短路径的顶点集合,逐步更新最短路径信息,最终得到从源点到所有其他顶点的最短路径。这个算法在实际应用中非常广泛,例如在网络路由、地图导航等领域都有重要的应用价值。
热门推荐
专家提醒:1.5岁宝宝不宜观影,这些因素可能影响视力发育
《惊天救援》:一场灾难背后的多重反思
车载蓝牙连接有哪些常见问题?如何快速解决连接故障?
西北妇女儿童医院专家提醒:儿童观影需谨慎,这些护眼要点请收好
海神缘上的甜蜜重逢:霍雨浩与王冬儿的动人爱情
《绝世唐门》:霍雨浩与王冬儿爱情背后的心碎女孩们
《斗罗大陆2绝世唐门》第75集引发争议,魔改剧情让观众不满
川青藏线探秘:四川至青海自驾黄金路线指南
“走出去”成大势所趋,企业“出海”如何落地?| 逐潮向海
用好“自治金项目”这把“金钥匙” 激发居民自治热情
朝阳市消协教你应对空调售后纠纷
用Echarts绘制中国地图:从数据获取到交互实现
集成供应链管理如何灵活应对多变的市场需求?
中国古代地图:从制图六体到京杭运河全图
产品一致性从哪几个方面控制
广东省名中医池晓玲:肝病慢病管理新突破
池晓玲教授:从时间医学到养生保健,全方位解读健康管理
池晓玲:广东省中医院肝病专家
国家版图意识宣传周:自然资源部教你获取标准地图
标准地图服务:获取权威地图的官方指南
自然资源部教你如何获取标准地图
四川火锅:舌尖上的盛宴
涮羊肉时,哪个部位最好吃?答案在这里
“我在汕头过大年”|看看外国友人都体验了什么潮汕年俗
冯小刚新作:《唐山大地震》幕后故事
6个月大的猫咪成长全记录(了解宠物猫6个月成长过程)
卫生间的人性化布局
儿童频尿急尿症候群:从心理调节到家庭干预的全面指南
中药调理尿频,你get了吗?
高情商聊天秘籍:情感管理助你成为聊天高手