刚学搜索时,最短路径的方法就是暴力穷举找出那一段最短的。
搜索一般来说都是指数级的时间复杂度,这个复杂度通常难以接受。
比起搜索(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];
}
}
}
}