图-最短路径-Dijkstra算法

来源:互联网 发布:散热仿真软件 编辑:程序博客网 时间:2024/05/20 19:30

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

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

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

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

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

#include<iostream>using namespace std;#define MAX 9999int 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;//自己到自己为0for(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;}/*测试数据50 0 1 0 30 0 0 5 51 0 0 1 20 5 1 0 23 5 2 2 030 1 21 0 32 3 0*/int main(){init();cout<<"----"<<endl;dijkstra(1);return 0;}




0 0
原创粉丝点击