dijkstra堆优化 详解(洛谷模板题)
来源:互联网 发布:淘宝零食店铺哪里进货 编辑:程序博客网 时间:2024/06/05 16:23
一、算法概况
dijkstra是一种稳定的求单源最短路的算法,时间复杂度O((m+n)logn) ,m表示边数,n表示点数。
二、算法过程
1.将源点以及和他相连的点加入堆
2.选出堆顶元素A(代价最小的元素),将他从堆中删除,然后调整堆
3. 处理与u相邻的,未被访问过的,满足三角不等式的顶点
1):若该点在堆里,更新距离,并调整该元素在堆中的位置。
2):若该点不在堆里,加入堆,更新堆。
4. 若取到的A为终点,结束算法;否则重复步骤2、3。
(转自百度百科)
三、代码实现
void dij(int A){q.push(make_pair(0,A));//将源点的距离和源点加入堆for(int i=1;i<=n;i++){dis[i]=inf;//先将每个点的初始化}dis[A]=0;//源点到源点的距离是0while(!q.empty()){//如果堆不为空,即并不是所有与源点联通的点都被遍历到了,我们就continueint now=q.top().second;//取出当前堆顶的点q.pop();//弹出堆顶元素if(vis[now]) continue;//如果被访问过,我们就跳过vis[now]=1;//打标记for(int i=head[now];i;i=e[i].next){//遍历与now直接相连的点if(dis[now]+e[i].len<dis[e[i].to]){//如果满足三角形不等式dis[e[i].to]=dis[now]+e[i].len;//更新该点的最短路q.push(make_pair(dis[e[i].to],e[i].to));//讲我们更新的点加入堆}}}}
四、总代码
#include<iostream>#include<algorithm>#include<cstdio>#include<queue>#include<vector>const int maxn=1e6+7;const int inf=1e9+7;using namespace std;priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;struct node{int len,to,next;}e[maxn];int n,m,s,from,go,val,size=0,head[maxn],dis[maxn];bool vis[maxn];void addedge(int from,int go,int val){size++;e[size].to=go;e[size].len=val;e[size].next=head[from];head[from]=size;}void dij(int A){q.push(make_pair(0,A));for(int i=1;i<=n;i++){dis[i]=inf;}dis[A]=0;while(!q.empty()){int now=q.top().second;q.pop();if(vis[now]) continue;vis[now]=1;for(int i=head[now];i;i=e[i].next){if(dis[now]+e[i].len<dis[e[i].to]){dis[e[i].to]=dis[now]+e[i].len;q.push(make_pair(dis[e[i].to],e[i].to));}}}}int main(){scanf("%d%d%d",&n,&m,&s);for(int i=1;i<=m;i++){scanf("%d%d%d",&from,&go,&val);addedge(from,go,val);}dij(s);for(int i=1;i<=n;i++){if(dis[i]==inf){printf("2147483647 ");}else{printf("%d ",dis[i]);}}return 0;}
阅读全文
0 0
- dijkstra堆优化 详解(洛谷模板题)
- Dijkstra+堆优化 模板
- [ 模板 ] 堆优化Dijkstra
- Dijkstra+堆优化模板
- Dijkstra算法+堆优化(模板)
- 【模板】Dijkstra+前向星+堆优化 (模板题:洛谷P3371)
- 洛谷 P3371 【模板】单源最短路径(Dijkstra + 堆优化)
- 最短路~dijkstra堆优化模板
- 单源最短路---dijkstra模板(二叉堆优化)
- 【讲解 + 模板】Dijkstra迪杰斯特拉+堆优化
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
- Dijkstra+堆优化模板 (手写堆简单易懂)
- P3371 【模板】单源最短路径 SPFA优化 dijkstra堆优化
- 最短路 + 邻接表 + 堆优化(模板)(Dijkstra + SPFA)
- aoj-2249 Road Construction 单源最短路dijkstra+堆优化(模板)
- hdu 2544 单源最短路问题 dijkstra+堆优化模板
- 最短路模板[spfa][dijkstra+堆优化][floyd]
- 堆(优先队列)优化dijkstra(邻接矩阵)
- android monkey 测试策略
- 选择排序,二分查找,Arrays类操作数组的各种方法
- shell学习
- LINUX下常用SHELL指令
- there is nothing....
- dijkstra堆优化 详解(洛谷模板题)
- 6.3.2 层次遍历二叉树【算法入门经典】【结构体指针】
- Redis之 列表(Lists)
- mark spring bean-annotation 支持
- 数据库基础(转载)
- js之变量提升
- 解决CserialPort类串口程序中WriteToPort只能发送一次问题
- Java serialVersionUID作用和生成
- 踩过LargeVis的坑