2017/9/12 迪杰特斯拉专栏from yty

本文介绍了迪杰特斯拉(Dijkstra)算法的基本概念和实现步骤,通过详细的代码注释和步骤解析,帮助读者理解如何使用该算法求解最短路径问题。主要内容包括初始化距离数组、设置初始状态、寻找未访问点中与起点的最短距离以及三角形迭代更新最短路径。
摘要由CSDN通过智能技术生成

    这两天,刘老师给我们大致讲了一下有关图论的知识。老师真的是一波操作猛如虎,下面是学生懵逼眼迷离......还好,我大致都听懂了,也只是有点小懵......回头我研究了两三个小时的迪杰特斯拉算法,终于研究出了一套规律,彻彻底底搞懂了我迪哥博大精深的思维,下面我就详细讲解一下。

    首先附上代码和注释

   

int dis[500] ;//start到i的最短距离

int a[500][500]; //矩阵

bool f[500];//两个集合

int n;//n个点

int k;//记录最小的编号;

 

 

void dijkstra(int st)//st表示最初的点



 for(int ii=1;ii<=n;ii++)

 {

  d[ii]=a[st][ii];//输入矩阵之前来一个memset(a,10,sizeof(10))使得没有路径的两个点距离很大

 }



 memset(f,false,sizeof(f));//初始状态 表示都没访问过



 f[st]=true;

 d[st]=0;



 for(inti=1;i<=n;i++)

 {

 

  int min=10000000;

  k=0;

  for(intj=1;j<=n;j++)

  {

   if(!f[j]&&(d[j]<min))

   {

    min=d[j];//

    k=j;//找到最小的距离和对应的节点

   }

  }



   if(k==0)

   return ;//已经找不到了

 

 

   f[k]=true;//k加入集合1

   for(int l=1;l<=n;l++)//三角形迭代,更新最短距离

   {

    if(!f[l]&&(d[k]+a[k][l]<d[l]))

    {

        d[l]=d[k]+d[k][l];//如果没有访问过而且符合三角形迭代就更新

       }

   }

 

 }





详细注释

一.           定义

二.           将所有点到start的距离搞到一个数组里

三.           将所有点搞成初始状态(即都是false)

四.           将start变为真且将start到start的距离改为0

五.           开始一个大循环(即关键部分)

1.     定义后进入一个小循环,找到假的部分中离start最近的点和这个点的位置

2.     进入一个判定:如果k==0,说明已经没有点了,结束整个函数;

                如果k不等于0,继续。

3.     把k变为真后进入最重要的循环,进行三角形迭代并更新最短距离。




     看完估计连傻子都能懂,接着附上伪代码:

int dis[500] ;//start到i的最短距离
int a[500][500]; //矩阵
bool f[500];//两个集合 
int n;//n个点 
int k;//记录最小的编号;
 
void dijkstra(int st)//st表示最初的点 
{
 for(int ii=1;ii<=n;ii++)
 {
  d[ii]=a[st][ii];//输入矩阵之前来一个memset(a,10,sizeof(10))使得没有路径的两个点距离无限大
 }
 memset(f,false,sizeof(f));//初始状态 表示都没访问过
 f[st]=true;
 d[st]=0;
 for(int i=1;i<=n;i++)
 {
  int min=10000000;
  k=0;
  for(int j=1;j<=n;j++)
  {
   if(!f[j]&&(d[j]<min))
   {
    min=d[j];//
    k=j;//找到最小的距离和对应的节点
   }
  }
   if(k==0)
   return ;//已经找不到了
   f[k]=true;//把k加入集合1
   for(int l=1;l<=n;l++)//三角形迭代,更新最短距离
   {
    if(!f[l]&&(d[k]+a[k][l]<d[l]))
    {
	 d[l]=d[k]+a[k][l];//如果没有访问过而且符合三角形迭代就更新
	}
   }
 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值