Dijkstra-最短单源路径和

Dijkstra算法的概要

摘自百度百科

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止

注意:Dijkstar解决有向无负权图的单源最短路径问题(可以是有环图)

Dijkstra的实现思想

  • Dijkstra 算法从指定的节点(源节点)出发,寻找它与图中所有其它节点之间的最短路径。

  • Dijkstra 算法会记录当前已知的最短路径,并在寻找到更短的路径时更新。

  • 一旦找到源节点与其他节点之间的最短路径,那个节点会被标记为“已访问”并添加到路径中。

  • 重复寻找过程,直到图中所有节点都已经添加到路径中。这样,就可以得到从源节点出发访问所有其他节点的最短路径方案。

Dijkstra代码实现

对于给定的图:求D到其他点的最短路径

 
#include<iostream>
using namespace std;
const int INF=0x3f3f3f3f;
int matrix[7][7]=
{
        //A    B   C   D   E   F  G
/*A*/{INF,12,INF,INF,INF,16,14},
/*B*/{12,INF,10,INF,INF,7,INF},
/*C*/{INF,10,INF,3,5,6,INF},
/*D*/{INF,INF,3,INF,4,INF,INF},
/*E*/{INF,INF,5,4,INF,2,8},
/*F*/{16,7,6,INF,2,INF,9},
/*G*/{14,INF,INF,INF,8,9,INF}
};
int vis[7],s[7],u[7],nextnode[7];
void dijkstra(int index)
{
        vis[index]=1;
        for(int i=0;i<7;i++)
        {
                u[i]=matrix[index][i];
        }
        int min_cur=index;
        int count=6;
        while(count--)
        {
                int minx=INF;
                for(int i=0;i<7;i++)
                {
                        if(u[i]<minx&&!vis[i])
                        {
                                minx=u[i];
                                min_cur=i;
                        }
                }
                vis[min_cur]=1;
                s[min_cur]=minx;
                for(int i=0;i<7;i++)
                {
                        int tmp=matrix[min_cur][i]==INF?INF:minx+matrix[min_cur][i];
                        if(!vis[i]&&tmp<u[i])
                        {
                                u[i]=tmp;
                                nextnode[i]=min_cur;
                        }
                }
        }
}
int main()
{
        for(int i=0;i<7;i++)
        {
                nextnode[i]=-1;
        }
        dijkstra(3);
        for(int i=0;i<7;i++)
        {
                cout<<"D到"<<char(i+'A')<<"的最短路径:"<<s[i]<<endl;
        }

        int index=0;
        for(int i=0;i<7;i++)
        {
                int index=i;
                while(index!=-1)
                {
                        cout<<char(index+'A');
                        index=nextnode[index];
                }
                cout<<"D"<<endl;
        }

        return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值