前篇所叙述的试验并不难:其中比较关键的是如何计算所有节点之间的最短路,用floyd算法即可实现,打印路径只需要用一个前驱矩阵即可
计算最短路径大代码为:
void computePath(Graph &G)
{
int i, j, k;
for(i = 0; i < G.size; i ++)
for(j = 0; j < G.size; j ++)
G.path[i][j] = j;
int len;
for(k = 0; k < G.size; k ++){
for(i = 0; i < G.size; i ++){
for(j = 0; j < G.size; j ++){
len = G.graph[i][k] + G.graph[k][j];
if(G.graph[i][j] > len)
{
G.graph[i][j] = len;
G.path[i][j] = G.path[i][k]; //标记到该点的前一个点
}
else if(len == G.graph[i][j]) //若距离相同
{
if(G.path[i][j] > G.path[i][k]) //判断是否为字典顺序
G.path[i][j] = G.path[i][k];
}
}
}
}
}
void showPath(Graph &G, int i, int j)
{
int k = i;
printf("%d", k+1);
while(k != j) //输出路径从起点直至终点
{
printf("-->%d", G.path[k][j]+1);
k = G.path[k][j];
}
}
完整代码: