~关于Floyd算法 怎么记录某两点最短路径-所经过的结点
求助~关于Floyd算法 如何记录某两点最短路径-所经过的结点?
如题~~
小弟现在在做一个关于图各种算法的软件,要用窗口演示出各种算法的结果。
现在做到最短路径 Floyd算法。
网上搜索到很多算法,但都是只是得出了两点之间最短路径的数值。
我想问问如何纪录某两点之间最短路径所经过那些结点呢?
以下是一个Floyd算法,如何纪录经过的最短路径呢?
void Floyd(int G[][],int n)
{
int i,j,k;
for(i=0;i <n;i++)
for(j=0;j <n;j++)
G[i][j]=MAX;
for(i=0;i <n;i++)
for(j=0;j <n;j++)
for(k=0;k <n;k++)
if(G[j][k] > G[j][i] + G[i][k])
G[j][k]=G[j][i] + G[i][k];
return ;
}
------解决方案--------------------
path[i][j]表示从顶点i到顶点j的路径上,顶点j的前驱
void floyd(int numVertices) {
for (int i = 0; i < numVertices; i++) {
for (int j = 0; j < numVertices; j++) {
a[i][j] = weight(i, j);
if (i != j && a[i][j] < MAXNUM) {
path[i][j] = i;
}
else {
path[i][j] = -1;
}
}
}
for (int k = 0; k < numVertices; k++) {
for (int i = 0; i < numVertices; i++) {
for (int j = 0; j < numVertices; j++) {
if (a[i][k] + a[k][j] < a[i][j]) {
a[i][j] = a[i][k] + a[k][j];
path[i][j] = path[k][j];
}
}
}
}
}
如题~~
小弟现在在做一个关于图各种算法的软件,要用窗口演示出各种算法的结果。
现在做到最短路径 Floyd算法。
网上搜索到很多算法,但都是只是得出了两点之间最短路径的数值。
我想问问如何纪录某两点之间最短路径所经过那些结点呢?
以下是一个Floyd算法,如何纪录经过的最短路径呢?
void Floyd(int G[][],int n)
{
int i,j,k;
for(i=0;i <n;i++)
for(j=0;j <n;j++)
G[i][j]=MAX;
for(i=0;i <n;i++)
for(j=0;j <n;j++)
for(k=0;k <n;k++)
if(G[j][k] > G[j][i] + G[i][k])
G[j][k]=G[j][i] + G[i][k];
return ;
}
------解决方案--------------------
path[i][j]表示从顶点i到顶点j的路径上,顶点j的前驱
void floyd(int numVertices) {
for (int i = 0; i < numVertices; i++) {
for (int j = 0; j < numVertices; j++) {
a[i][j] = weight(i, j);
if (i != j && a[i][j] < MAXNUM) {
path[i][j] = i;
}
else {
path[i][j] = -1;
}
}
}
for (int k = 0; k < numVertices; k++) {
for (int i = 0; i < numVertices; i++) {
for (int j = 0; j < numVertices; j++) {
if (a[i][k] + a[k][j] < a[i][j]) {
a[i][j] = a[i][k] + a[k][j];
path[i][j] = path[k][j];
}
}
}
}
}