Luogu P4779

利用堆/优先队列快速取得权值最小的点。

在稠密图中的表现比SPFA要优秀。

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct data
{
long long next,to,val;
}edge[500005];
long long cnt,head[500005],n,m,s,u,v,w,cost[500005];
bool vis[500005];
struct node
{
long long id,val;
bool operator < (const node&x) const
{
return val>x.val;
}
};
priority_queue<node> que;
void add(long long sta,long long to,long long val)
{
edge[++cnt].to=to;
edge[cnt].val=val;
edge[cnt].next=head[sta];
head[sta]=cnt;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&s);
for (int i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&u,&v,&w);
add(u,v,w);
}
for (int i=1;i<=n;i++) cost[i]=214748364700000000;
cost[s]=0;
node tmp;
tmp.id=s;tmp.val=cost[s];
que.push(tmp);
while (!que.empty())
{
node minp=que.top();
que.pop();
if (vis[minp.id]) continue;
vis[minp.id]=true;
for (int j=head[minp.id];j;j=edge[j].next)
{
long long tmpv=edge[j].to,tmpw=edge[j].val;
if (cost[tmpv]>tmpw+minp.val)
{
cost[tmpv]=tmpw+minp.val;
tmp.val=cost[tmpv];
tmp.id=tmpv;
que.push(tmp);
}
}
}
for (int i=1;i<=n;i++) printf("%lld ",cost[i]);
return 0;
}

最新文章

  1. C#:lock锁与订单号(或交易号)的生成
  2. ionic 踩过的坑-基本布局
  3. kernel/ptrace.c
  4. JavaScript 、jQuery动态创建元素的关键字~
  5. 史上最全web.xml配置文件元素详解
  6. AngularJS+ASP.NET MVC+SignalR实现消息推送
  7. 使用nodejs进行WEB开发
  8. java加密算法入门(三)-非对称加密详解
  9. .net 小程序获取用户UnionID
  10. Linux telnet远程登录操作
  11. footer固定在页面底部的实现方法总结
  12. 在 IDEA中运行 WordCount
  13. 在Bootstrap开发框架的工作流模块中实现流程完成后更新资料状态处理
  14. 配置python3
  15. Java(常用排序算法)
  16. Codeforces | CF1033D 【Divisors】
  17. python字符串前面u,r,b的含义详解
  18. C# 利用反射将枚举绑定到下拉框
  19. POJ 1417 - True Liars - [带权并查集+DP]
  20. 机器学习理论基础学习16---高斯网络(GN)

热门文章

  1. Mysql数据库(六)视图
  2. 设计模式C++描述----14.外观(Facade)模式
  3. Python环境的搭建(windows系统)
  4. pythonpip的基本使用
  5. 前端技术之:JS开发几个有意思的东东
  6. hydra的使用
  7. 学习笔记51_MongoDB使用
  8. kettle计划任务
  9. 通俗易懂了解Vuex
  10. git下载安装