对于最短路的问题,很多时候我们只需要求出最短路径就可以了,但是有的时候需求知道所求最短路的路径
我们以Dijkstra算法为例,给出求最短路的路径的方法,这称为路径还原。在求最短路距离的时候,那些满足最短路判断的顶点k,就是最短路上的前驱结点,因此不断寻找前驱结点就可以恢复最短路。
CODE
int prev2[MAXVEX];
void dijkRj(int s)
{
int dis[MAXVEX];
bool used[MAXVEX];
fill(prev2, prev2 + V, -1);
fill(dis, dis + V, INF);
fill(used, used + V, false);
dis[s] = 0;
while (true)
{
int v = -1,mins=INF;
for (int u = 0; u < V; ++u)
{
if (!used[u] && dis[u] < mins)
{
mins = INF;
v = u;
}
}
if (v == -1)break;
used[v] = true;
for (int u = 0; u <G2[v].size(); ++u)
{
edge e = G2[v][u];
if (dis[e.to] > dis[v] + e.cost)
{
dis[e.to] = dis[v] + e.cost;
prev2[e.to] = v;
}
}
}
}
void getPath(int t)
{
vector<int> path;
for (; t != -1; t = prev2[t])path.push_back(t);
reverse(path.begin(), path.end());
for (int i = 0; i < path.size(); ++i)
printf("%d ", path[i]);
printf("\n");
}