单源最短路径

题目链接:https://www.luogu.org/problemnew/show/P4779

直到做了这个题才发现我之前写的堆优化dijkstra一直是错的。。

这个堆优化其实很容易理解,将枚举最小值改为从堆中取出最小值,改变dis时入堆即可

用单调队列维护时必须有两个值:点的编号和当前的距离

以距离为标准从小到大排序, 每次去除最小的

以前错的原因:

堆中只维护了点的编号,以dis[x]排序

这样做在取出一个元素操作后,会更新它周围一圈元素的dis值,

若它周围一圈元素中有的在堆中,dis值被改变后,堆的性质会遭到破坏

然而由于这道题太水了,我一直认为这是对的

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
#define il inline
#define re register
#define N 100010
#define M 200010
int n,m,s,dis[N];
struct FUCK{
int p;
int cost;
};
struct cmp{
il bool operator()(FUCK ZYX,FUCK YSH){
return ZYX.cost>YSH.cost;
}
};
priority_queue<FUCK,vector<FUCK>,cmp> q;
il int read(){
int x=; char c=getchar();
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') { x=(x<<)+(x<<)+c-''; c=getchar(); }
return x;
}
void write(int x){
if(x>) write(x/);
putchar(x%+'');
}
struct NODE{
int to,w,next;
} e[M];
int Head[N],num;
il void add(int x,int y,int w){
e[++num].to=y;
e[num].w=w;
e[num].next=Head[x];
Head[x]=num;
}
bool used[N];
int main()
{
n=read(); m=read(); s=read();
int x,y,w;
for(re int i=;i<=m;i++){
x=read(); y=read(); w=read();
add(x,y,w);
}
memset(dis,,sizeof(dis));
dis[s]=;
q.push((FUCK){s,});
while(!q.empty()){
FUCK k=q.top();
q.pop();
int u=k.p;
if(used[u]) continue;
used[u]=;
for(re int i=Head[u];i;i=e[i].next){
int v=e[i].to;
if(dis[v]>dis[u]+e[i].w){
dis[v]=dis[u]+e[i].w;
q.push(FUCK{v,dis[v]});
}
}
}
for(re int i=;i<=n;i++)
write(dis[i]),putchar(' ');
return ;
}

最新文章

  1. Shell入门教程:命令替换 $() 和 ``
  2. JAVA 求和程序
  3. Odoo ir actions 分析
  4. Selenium2学习-001-Selenium2 WebUI自动化Java开发 Windows 环境配置
  5. How to using T-SQL statement copy table[SQL]
  6. 【Spark】概述
  7. &lt;转&gt;linux 下stm32开发环境安装
  8. Android开发报错系列(一),java.lang.NullPointerException,at android.widget.ListView.setupChild
  9. SqlServer存储过程传入Table参数
  10. git分支综述
  11. 4.sass的分支结构、循环结构、函数
  12. NVIDIA Titan Xp Star Wars Collector&#39;s Edition显卡深度学习工作站 + Ubuntu17.10 + Tensorflow-gpu + Anaconda3 + Python 3.6 设置
  13. iOS 10 推送全解析,注意事项
  14. Pycharm远程调试服务器代码(使用Pipenv管理虚拟环境)
  15. C#解决方案生成工具(2)
  16. elbow 求拐点
  17. dom4j 操作总结
  18. 在CentOS6的上安装Windows2012R2的KVM虚拟机
  19. 二、Adapter 适配器
  20. C语言入门:06.基本运算

热门文章

  1. Vue.js-----轻量高效的MVVM框架(六、Class与Style绑定)
  2. Webstrom 中写Vue没有代码提示如何解决?
  3. [转]JavaScriptSerializer中日期序列化
  4. 打开/关闭网卡无线WIFI模块
  5. Kudu的性能测试
  6. H-ui出现提交后没办法关闭
  7. MySQL中的information_schema
  8. c#获取目录
  9. hystrix应用介绍(三)
  10. Vue之组件间传值