Dijkstra最短路径算法的C++实现

Dijkstra最短路径算法的C++实现

Dijkstra最短路径算法是Dijkstra提出的一种贪心算法,有三个数组:原始数组P,存放节点数据;筛选数组S,存放比较过后的路径点;剩余节点D存放未比较的点的数据。输入节点数据,各节点之间没有直接路径时,路径长度设为无穷大INT_MAX,选出出发点以及目的点(默认为1和最后一个点),将1号点放入S,更新D,然后遍历D中与1号点距离最近的点(设为2号点),放入S中,比较D中各点通过2号点到1号点的路径变化,若路径变短,则更新该节点的路径信息(即L1-2+L2-3<L1-3,则更新L1-3=L1-2+L2-3),若路径不变或更长,D中节点信息不变,如此将D中节点路径长度更新完后,再选择下一个距1最近的点,放入S,更新D中路径信息。
通过遍历比较和更新,最后得到1号点到各个节点的最短路径长度。

C++代码

#include<iostream>
#include<limits.h>
#define N 100
using namespacestd;

int main()
{
    using std::cout;
    cout.setf(std::ios::left);

       //输入节点数

       int number;

       cout<<"Please input your points number(from 1 to 100):";

       cin>>number;

       cout<<"The number of points is"<<number<<endl;

       cout<<"Your starting point is1,and the destination is "<<number<<endl;
      
       //输入数组,初始化各节点之间的路线长度

       int   p[N][N];
       int j1,j2;

      cout<<"Input the length(0 ~1000) to each points,if the way do not exist,input a number larger than 1000!!!"<<"\n";

       for(int i=0; i<number; i++)

              for(int j=i;j<number;j++)

              {cout<<"Please inputthe path length from "<<i+1<<" to"<<j+1<<" is: ";

              cin>>p[i][j];

              p[j][i]=p[i][j];

              }

 

       //初始化d数组,存放1到各节点的距离

       int d[N];

       for(i=0;i<number;i++)d[i]=p[0][i];

 

       //输出p数组,察看输入是否正确

       for(i=0;i<number;i++)

       {cout<<"\n";

              for(int j=0;j<number;j++)

              {cout.width(7);cout<<p[i][j];}

       }

       cout<<endl;

       //设置两个集合S放置选中的节点

       int s[N];

       int v=0;

       s[0]=1;

       //选出集合中距1最近的节点,放入S中;

       for(i=0;i<number;i++) 

       { int min=INT_MAX;

        for(j1=1;j1<number;j1++)

               if((s[j1]!=1)&&p[i][j1]<min)

               {min=p[i][j1];  

                v=j1;}

              s[v]=1;

 

       //找出D中值的变化

        
for(j2=1;j2<number;j2++)

              if((s[j2]!=1)&&p[v][j2]<INT_MAX)

              {if((p[v][j2]+d[v])<d[j2])

                     d[j2]=d[v]+p[v][j2];

              };

       }

    //输出最短距离

       cout<<"the shortest way from1" <<" to " <<number<<" is "<<d[number-1]<<endl;

       return 0;

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值