请使用c语言写迪杰斯特拉算法
时间: 2023-03-13 09:26:20 浏览: 177
用C语言写的迪杰斯特拉算法,
4星 · 用户满意度95%
我可以为您提供一个使用C语言实现迪杰斯特拉算法的示例:#include <stdio.h>
#define INF 99999
// 图的邻接矩阵表示法
typedef struct
{
int arc[10][10];
int vexnum, arcnum;
}MGraph;
// 创建图
void CreateMGraph(MGraph *G)
{
int i, j, k, w;
G->vexnum = 6;
G->arcnum = 9;
// 读入顶点信息,建立邻接矩阵
for (i = 0; i < G->vexnum; i++)
for (j = 0; j < G->vexnum; j++)
{
if (i == j)
G->arc[i][j] = 0;
else
G->arc[i][j] = INF;
}
printf("请输入每条边的权值:\n");
for (k = 0; k < G->arcnum; k++)
{
scanf("%d %d %d", &i, &j, &w);
G->arc[i][j] = w;
G->arc[j][i] = G->arc[i][j];
}
}
// 迪杰斯特拉算法
void Dijkstra(MGraph G, int v0, int dist[], int path[])
{
int i, j, k, min;
int final[10]; // final[w]=1表示求得顶点v0至vw的最短路径
// 初始化
for (i = 0; i < G.vexnum; i++)
{
final[i] = 0; // 初始都未经过最短路径算法
dist[i] = G.arc[v0][i]; // 初始路程为“顶点v0”到“顶点i”的权值
path[i] = 0; // 顶点i的前驱顶点为0
}
// 将顶点v0加入到最短路径中
dist[v0] = 0;
final[v0] = 1;
// 通过n-1次循环,求得v0到其余各点的最短路径
for (i = 1; i < G.vexnum; i++)
{
min = INF;
// 寻找离v0最近的顶点
for (j = 0; j < G.vexnum; j++)
{
if (final[j] == 0 && dist[j] < min)
{
k = j;
min = dist[j];
}
}
// 将新加入最短路径的顶点置为1
final[k] = 1;
// 修正当前最短路径及距离
for (j = 0; j < G.vexnum; j++)
{
// 如果经过下标为k顶点路径比原两点间路径更短,则更新dist[j]和path[j]
if (final[j] == 0 && (min + G.arc[k][j] < dist[j]))
{
dist[j] = min + G.arc[k][j];
path[j] = k;
}
}
}
}
int main()
{
MGraph G;
int dist[10];
int path[10];
int v0;
CreateMGraph(&G);
printf("请输入源点:");
scanf("%d", &v0);
Dijkstra(G, v0, dist, path);
return 0;
}
阅读全文