This commit is contained in:
2025-12-16 09:06:45 +08:00
parent e325fd405e
commit 0c012f7938
+13 -5
View File
@@ -27,11 +27,11 @@ void ShortestPath_DIJ(AMGraph G, int v0)
int n, i, v, w; // n为顶点数,i为循环变量,v为当前顶点,w为邻接顶点
int min;
n = G->vexnum;
for (v = 0; v < n;++v)
for (v = 0; v < n; ++v)
{
S[v] = false;
D[v] = G->arcs[v0][v];
if (D[v]<MaxInt)
if (D[v] < MaxInt)
{
Path[v] = v0;
}
@@ -50,7 +50,7 @@ void ShortestPath_DIJ(AMGraph G, int v0)
min = MaxInt;
for (w = 0; w < n; ++w)
{
if (!S[w] && D[w]<min)
if (!S[w] && D[w] < min)
{
v = w;
min = D[w];
@@ -79,6 +79,7 @@ int main(void)
#endif
// 输入顶点数和边数
printf("请输入顶点数n和边数m");
int n, m;
if (scanf("%d %d", &n, &m) != 2)
{
@@ -93,31 +94,38 @@ int main(void)
{
g->arcs[i] = (int *)malloc((size_t)n * sizeof(int));
for (int j = 0; j < n; ++j)
{
g->arcs[i][j] = (i == j) ? 0 : MaxInt;
}
}
// 输入边信息
for (int i = 0; i < m; ++i)
{
printf("请输入第%d条边的顶点x、y和边权z", i + 1);
int x, y, z;
if (scanf("%d %d %d", &x, &y, &z) != 3)
{
return 0;
}
if (x >= 1 && x <= n && y >= 1 && y <= n)
{
if (z < g->arcs[x - 1][y - 1])
{
g->arcs[x - 1][y - 1] = z;
}
}
}
// 调用Dijkstra算法
ShortestPath_DIJ(g, 0);
if (D[n - 1] >= MaxInt)
{
printf("-1\n");
printf("从顶点0到顶点%d不存在路径\n", n - 1);
}
else
{
printf("%d\n", D[n - 1]);
printf("从顶点0到顶点%d的最短路径长度为:%d\n", n - 1, D[n - 1]);
}
// 释放内存