Dijkstra算法
Posted lixiao189
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dijkstra算法相关的知识,希望对你有一定的参考价值。
算法缺点:
这个算法只能用于非负路径的图。如果路径中有负的花费,就不可以使用。
算法时间复杂度:
- 优化前:$ O(n^2) $
- 用堆优化后:$ O(M+N)log_2N $
代码:
#include <iostream>
#include <cstdio>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1e4+5;
const int INF = 2147483647;
int n,m,s; //s为起点
long long dis[N];
int vis[N];
struct node
{
int u; //目标结点编号
long long w; //到达目标结点需要花费的权值
};
vector <node> graph[N];
void add(int x,int y,int z)
{
node temp;
temp.u=y;
temp.w=z;
graph[x].push_back(temp);
}
void Dijkstra(int x)
{
int k=n-1,pos;
while(k--)
{
//选出没走过的dis[i]最小的点
int Min=INF;
for(int i=1;i<=n;i++)
{
if(dis[i]<=Min && vis[i]==0 && i!=s)
{
Min=dis[i];
pos=i;
}
}
vis[pos]++;
vector <node> :: iterator it;
for(it=graph[pos].begin();it!=graph[pos].end();it++)
{
dis[it->u]=min((it->w)+dis[pos],dis[it->u]);
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
int temp_x,temp_y,temp_z;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&temp_x,&temp_y,&temp_z);
if(temp_x==temp_y) temp_z=0;
add(temp_x,temp_y,temp_z);
}
//初始化dis数组
for(int i=1;i<=n;i++)
{
if(i==s)
dis[i]=0;
else
dis[i]=INF;
}
vector <node> :: iterator it;
for(it=graph[s].begin();it!=graph[s].end();it++)
{
dis[it->u]=min(dis[it->u],it->w); //这里去重边很重要
}
Dijkstra(s);
//输出答案
for(int i=1;i<=n;i++)
printf("%d ",dis[i]);
printf("
");
return 0;
}
以上是关于Dijkstra算法的主要内容,如果未能解决你的问题,请参考以下文章
Dijkstra算法A*算法D*算法LPA*算法和D* Lite算法详解汇总(原理matlab代码)格栅地图