Dijkstra算法——最短路径(初步认识)

刚学搜索时,最短路径的方法就是暴力穷举找出那一段最短的。

搜索一般来说都是指数级的时间复杂度,这个复杂度通常难以接受。

 

比起搜索(2^n)的搜索 我们更喜欢(n^2)的DP是不是~~~~

 

dijkstra算法就是基于一种动态规划的思路。

简介:
对于任意一个节点u,没访问每一个领接节点v,

如果对于节点v本身对到原点s的估计距离 大于 u到s的距离+u到v的距离,那么更新v到s的距离。

(什么叫估计距离?一条连通图中有不同路径,从不同路走的路程不一样,所以每次估计不一样,至于初始值就设为INFI)

思路其实很简单。

配合一个队列实现很简单。

 

 

伪代码:

Q<-队列

Q.push(原点S)

while(Q非空)

{

   t=Q.front();

   :对于每一个t的邻接点q

  begin

       if (d[q]>d[t]+w(t,q)) then

          d[q]=d[t]+w(t,q));

  end;

}

 

确实是一个并不复杂但有用的好算法。

 

c++测试代码

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int N=120;
vector <int> vec[N];
queue <int> qb;
int s;
int map[N][N];
int dist[N];
int n;
void process();
int main() 
{
 memset(dist,999999,sizeof(dist));
 memset(map,0,sizeof(map));
 cin>>n;
 int u=0,v,cost;
 for (int i=0;i<n;++i)
 {
  cin>>u>>v>>cost;
  map[u][v]=cost;
  vec[u].push_back(v);
 }
 cin>>s;
 int sb;
 cin>>sb;
 process();
 cout<<dist[sb];
 
 return 0;
}
void process()
{
 while(!qb.empty())qb.pop();
 //
 
 qb.push(s);
 while(!qb.empty())
 {
  int t=qb.front();
  qb.pop();
  for (int j=0;j<vec[t].size();++j)
  {
   //t->current point
   //q->selected point
   int q=vec[t][j];
   qb.push(q);
   if(t==s)
     {
      dist[q]=map[t][q];
     }
   else if(dist[q]>dist[t]+map[t][q])
   {
    dist[q]=dist[t]+map[t][q];
   }
   
   
  }
  
  
  
 }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值