图-最短路径-Dijkstra算法

算法步骤(该算法要求边的权值不能为负!!!解决负值的问题需要用到Bellman-Ford算法):

1 :从要找的起点比如A出发,找出A距离其他点路径最短的那个点比如为B,标记访问。(A无法到达的点是为距离无限大)

2:通过B点,更新A通过B点到其他点的距离,找出这时到其它点(没有标记访问的)最短的距离,记录该点比如为C,标记访问。

3:通过C点,重复操作步骤2

代码(该代码用邻接矩阵来存图,当图很大的时候,这种方法效率低):

#include<iostream>
using namespace std;
#define MAX 9999
int n;
int Map[2017][2017];//存图
int visit[2017];//访问标记
int d[2017];//源点到各点最短距离

/*初始化*/
void init(){

cout<<"how many node:?\n";
cin>>n;
int i,j;
for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
{
    cin>>Map[i][j];
    if(Map[i][j]==0)//没有记录到即无法到达,距离设为足够大
        Map[i][j]=MAX;
}
}

/*算法*/
void dijkstra(int x){

int i,j,Min,p;
for(i=1;i<=n;i++)
    d[i]=Map[x][i];
visit[x]=1;//记录自己已被访问
d[x]=0;//自己到自己为0
for(i=1;i<n;i++)//循环n-1遍就可以将所有点记录了
{
    Min=MAX;
    for(j=1;j<=n;j++)//找出当前最短的边
        if(!visit[j] && Min>d[j])//没找过的点
    {
        p=j;
        Min=d[j];
    }
    visit[p]=1;//记录该点
    for(j=1;j<=n;j++)
        if(!visit[j] && Min+Map[p][j]<d[j])//更新操作
        d[j]=Min+Map[p][j];
}
cout<<"点1到各点最短距离依次为:"<<endl;
for(int i=1;i<=n;i++)
    cout<<i<<"-------"<<d[i]<<endl;
}
/*测试数据
5
0 0 1 0 3
0 0 0 5 5
1 0 0 1 2
0 5 1 0 2
3 5 2 2 0

3
0 1 2
1 0 3
2 3 0
*/
int main(){

init();
cout<<"----"<<endl;
dijkstra(1);
return 0;

}


    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/gaoapp/article/details/71107710
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞