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;
} 
 


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

相关文章推荐

PriorityQueue+Dijkstra优先队列优化的Dijkstra

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

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

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

再谈Dijkstra算法和堆优化

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

dijkstra算法+堆优化 ///各种被坑~~~

主要思想:在选取当前距离最小点时,用堆的方法实现选最小点上时间的优化。 新手第一次写,各种被坑!!! 1、一定要用最小堆从堆顶取值,而不能用最大堆取排在最后的值,因为排在最后的值不一定是最小的。 2、...

Dijkstra+堆优化

关于dijkstra,我们应该比较熟悉了,今天讲的是dijkstra的堆优化(O(ElogN))(如果连dijkstra都不知道的小朋友给你一个网址:http://www.cnblogs.com/do...

Dijkstra + 堆优化

Dijkstra算法原理请见:最短路径问题(Dijkstra解法) 该算法对于稠密图更加有效: 对于给出具有非负权重的边和源顶点S的图G,算法可在O(mlogn)时间内找出从s点到其他每一...

poj 2502 题解 & dijkstra的堆优化

【序言】求单源最短路径一直是个很热门的话题。网上,大家也在争相比试dijkstra和SPFA的优越性。遗憾的是,我一直没学过dijkstra的堆优化,于是打算好好学习一下。以下是poj上随便找的一道最...

Dijkstra算法+堆优化(模板)

/* 使用优先队列Dijkstra算法 复杂度O(ElogE) 注意对vector E[MAXN]进行初始化后加边 */ #include #include #include #include #i...

堆优化的dijkstra(迪杰斯特拉)

前面在讲prim算法的时候已经提到了dijkstra,这里再说说求最短路的dijkstra算法; 相比于邻接矩阵的存图方式我们可以用更适用于做题的链式前向星,更省空间; 我们也可以用STL的pri...

《三体》读后思考-泰勒展开/维度打击/黑暗森林

前言两个月前,老婆不知道吃错了什么药,心血来潮买了几本书,全是什么给孩子讲数学,量子物理之类的,小小才六岁啊…还有一部小说《三体》,当然,这肯定是她自己想看的了,也许是看到了有人总拿《三体》跟《盗墓》...
  • dog250
  • dog250
  • 2017-07-22 16:35
  • 41311
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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