Dij的堆优化


#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define M 100000 #define pa pair<int,int>//优先比较第一个元素 using namespace std; int d[M],n,m,cnt,head[M],next[M],u[M],dis[M],num,s,t; bool f[M]; void add(int from,int to,int di) { num++; u[num]=to; next[num]=head[from]; head[from]=num; dis[num]=di; } int main() { scanf("%d%d%d%d",&n,&m,&s,&t); for(int i=1;i<=m;i++) { int uu,vv,d; scanf("%d%d%d",&uu,&vv,&d); add(uu,vv,d); add(vv,uu,d); } memset(d,127/3,sizeof(d)); d[s]=0; priority_queue<pa,vector<pa>,greater<pa> > q;//堆优化 q.push(make_pair(0,s));//make一个pa 距离s为0 标号为s while(!q.empty()) { int p=q.top().second;//取出优先级最高的点的 q.pop(); if(f[p])//判重 continue; f[p]=1; for(int i=head[p];i;i=next[i]) { if(d[u[i]]>d[p]+dis[i]) { d[u[i]]=d[p]+dis[i]; q.push(make_pair(d[u[i]],u[i]));//make一个新的 pa } } } cout<<d[t]; return 0; }

 

转载于:https://www.cnblogs.com/yanlifneg/p/5432822.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值