Dijkstra算法求最短路径

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); 



}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值