修改错误代码void Dijkstra(Mgraph G,int v0,int p[],int dis[]) { int vis[v]; for(int i=0;v<G.vexnum;i++) { vis[i]=0;//vis数组初始为零 dis[i]=G.arcs[v0][i];//到v0点的距离数组初始为0 p[i]=0;//路径为0 } dis[v0]=0;//vo到vo的距离为0 vis[v0]=1;//将v0方置为1 int ant=0; for(int i=0;i<G.vexnum;i++) { int min=10000; for(int m=0;m<G.vexnum;m++) if(!dis[m])//m不在vis数组中即没有被遍历过 { if(dis[m]<min) { ant=m; min=dis[m]; } } } vis[ant]=1; for(int m=0;m<G.vexnum;m++) { if(!vis[m]&&(min+G.arcs[ant][m]<dis[m])) { dis[m]=min+G.arcs[ant][m];//更换最短路径 p[m]=ant; } } }
时间: 2024-01-04 20:02:57 浏览: 100
void Dijkstra(MGraph G, int v0, int p[], int dis[]) {
int vis[G.vexnum];
for(int i = 0; i < G.vexnum; i++) {
vis[i] = 0; // vis数组初始为零
dis[i] = G.arcs[v0][i]; // 到v0点的距离数组初始为G的v0行
p[i] = v0; // 到达i的最短路径经过v0
}
dis[v0] = 0; // v0到v0的距离为0
vis[v0] = 1; // 将v0标记为已访问
for (int i = 1; i < G.vexnum; i++) {
int min = INT_MAX;
int k = 0;
for (int j = 0; j < G.vexnum; j++) {
if (!vis[j] && dis[j] < min) {
min = dis[j]; // 更新最小值
k = j; // 更新最小值的下标
}
}
vis[k] = 1; // 标记k为已访问
for (int j = 0; j < G.vexnum; j++) {
if (!vis[j] && (min + G.arcs[k][j] < dis[j])) {
dis[j] = min + G.arcs[k][j]; // 更换最短路径
p[j] = k; // 更新路径
}
}
}
}
修改的主要问题包括:
1. vis数组的大小应该为G.vexnum,而不是v。
2. for循环中i应该小于G.vexnum,而不是v<G.vexnum。
3. 在for循环中应该找到未被访问过的距离最小的顶点k。
4. 在最后一个for循环中应该更新路径p[j],而不是p[m]。
5. 在寻找最小值时,min的初始值应该为INT_MAX,而不是10000。
阅读全文