dijkstra算法模板(优先队列优化)

原创 2015年11月21日 10:42:12

dijkstra算法是由荷兰计算机科学家狄克斯特拉1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有

向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。 


常规的dijkstra算法复杂度较高,为O(n^2),因为要花大量时间来找当前已知的距顶点距离最小的值,所以用优先队列(值小的先出队列)来优化,可省大量时间。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
using namespace std;


#define INF  0x3f3f3f3f   //定义一个很大的数


struct Node
{
int num,val;   //存放结点编号和到初始点的距离 
}nod;


priority_queue<Node> qq;;   //优先从小到大


bool operator < (Node a,Node b)
{
if(a.val == b.val) return a.num>b.num;
return a.val>b.val;              //先出小 
}


int book[100];  //检查这个点是否用过 
int dis[100];     //到原点最短距离 
int D[100][100];  //记录路径长度
int V,E; 


int main()
{
int a,b,d;
while(cin>>V>>E && V&& E)  //输入顶点数和边数 
{
while(!qq.empty()) qq.pop(); //清空
memset(book,0,sizeof(book));
memset(D,-1,sizeof(D)); 

for(int i=0;i<E;i++)
{
cin>>a>>b>>d;
D[a][b] = D[b][a] = d;
}

for(int i=2;i<=V;i++)
dis[i]=INF;

dis[1]=0;
nod.num=1;
nod.val=0;

qq.push(nod);   //将起点放入队列 

while(!qq.empty())  //不为空时 
{

for(int i=2;i<=V;i++)
{
if(D[qq.top().num][i] != -1  &&dis[i]>dis[qq.top().num] + D[qq.top().num][i]) 
{

dis[i]=dis[qq.top().num] + D[qq.top().num][i];
nod.num=i; nod.val=dis[i];
qq.push(nod);
}
}

qq.pop();
}

for(int i=1;i<=V;i++)
{
cout<<"初始点到"<<i<<"点的距离为:"<<dis[i]<<endl;
} 

}
return 0;
} 
 


版权声明:本文为博主原创文章,未经博主允许不得转载。

再谈Dijkstra算法和堆优化

用邻接矩阵的Dijkstra算法的代码: int mp[maxn][maxn]; int dis[maxn]; bool visit[maxn]; int n,m;   //V,E     void ...

最短路算法 堆优化 dijkstra+heap

private int heap[];//存储节点id的堆     private int inhp[];//存储节点id在堆里面的位置     private int size;//堆的大小    ...

dijkstra算法O(n²) 堆优化O(nlogn)

用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法。也就是说,只能计算起点只有一个的情况。 Dijkstra的时间复杂度是O (N2),它不能处理存在负边权的情况。 算法描述: ...

Heap+Dijkstra堆优化的Dijkstra

前面说到“原生的Dijkstra”,由于Dijkstra采用的是贪心策略,在贪心寻找当前距离源结点最短的结点时需要遍历所有的结点,这必然会导致效率的下降,时间复杂度为n^n。因此当数据量较大时会消耗较...

堆优化的dijkstra算法(以邻接表存储)

堆优化的dijkstra 对于dijkstra为单源最短路的算法,其未优化版本为直接遍历每个点来寻找到源点最近的点,再以该点去更新与之相连的点,直到将每个点都利用更新其他点,这样便寻找到了从源点K出发...

[最短路]使用优先队列优化的Dijkstra算法

用邻接矩阵的Dijkstra算法的代码:int cost[RANGE][RANGE]; int d[RANGE]; bool used[RANGE]; int n,m; //顶点数,边...

ACM:最短路,dijkstra,邻接表的建立,使用邻接表跟优先队列的dijkstra,Bellman-Ford,Floyd。。

(一) 所有边权均为正,不管有没有环,

PriorityQueue+Dijkstra优先队列优化的Dijkstra

前面分别介绍了“原生的Dijkstra”即毫无优化的Dijkstra,但这种Dijkstra的效率较低为n^n,因此面对较大数据量的时候需要对其进行优化,也就是优化所采用的贪心策略的实现,因此就有了H...

Dijkstra算法-(迪杰斯特拉)算法的迭代实现与优先队列实现 图解算法过程

Dijkstra算法-(迪杰斯特拉)算法之迭代实现 Dijkstra算法-(迪杰斯特拉)算法之优先队列实现...
  • collonn
  • collonn
  • 2014年01月11日 23:51
  • 6662

最短路径Dijkstra算法-优先队列优化

#include"cstdio" #include"queue" #include"algorithm" #define INF 1
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:dijkstra算法模板(优先队列优化)
举报原因:
原因补充:

(最多只允许输入30个字)