Dijkstra算法求最短路径
//Dijkstra算法用来求最短距离 已经实现了
//那么最短路径 如何求解并打印出来呢?
//此处的方法是记录路径中结点的前驱
if(v未被访问 && 以u为中介点可以使起点s到顶点v的最短距离d[v]更优 )
{
优化d[v];
令v的前驱为u;
}
//程序具体实现,邻接矩阵版
//n为顶点数,MAXV为最大顶点数
int n,G[MAXV][MAXV];
//起点到达各点的最短路径长度
//pre[v]表示从起点到顶点v的最短路径的前一个顶点(新添加)
int pre[MAXV];
//标记数组
bool vis[MAXV]={false};
//s为起点
void Dijkstra(int s)
{
fill(d,d+MAXV,INF);
for(int i=0;i<n;i++)
{
//初始状态设每个点的前驱为自身(新添加)
pre[i]=i;
}
//起点s到达自身的距离为0
d[s]=0;
for(int i=0;i<n;i++)
{
int u=-1;
int MIN=INF;
for(int j=0;j<n;j++)
{
if(vis[j]==false && d[j]<MIN )
{
u=j;
MIN=d[j];
}
}
//找不到小于INF的d[u],说明剩下的顶点和起点s不连通
if(u==-1)
{
return;
}
vis[u]=true;
for(int v=0;v<n;v++)
{
//如果v未访问 && u能到达v && 以u为中介点可以使d[v 更优
if(vis[v]==false && G[u][v]!=INF && d[u]+G[u][v]<d[v] )
{
//优化d[v]
d[v]=d[u]+G[u][v];
//记录v的前驱结点是u(新添加)
pre[v]=u;
}
}
}
}
//上面的知识求出了最短路径上的每个点的前驱,如何求整条路径呢?
/*比如:
//pre[4]=3;
//pre[3]=2;
//pre[2]=1;
//pre[1]=1;
*/
//用递归
//s为起点编号,v为当前访问的顶点编号(从终点开始递归)
void DFS(int s,int v)
{
//如果当前已经到达起点s,则输出起点并返回
if(v==s)
{
printf("%d\n",s);
return;
}
//递归访问v的前驱顶点pre[v]
DFS(s,pre[v]);
//从最深处return 回来之后,输出每一层的顶点号
printf("%d\n",v);
}