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