首页 > 其他 > 详细

dijkstra堆优化板子

时间:2019-10-26 15:24:58      阅读:62      评论:0      收藏:0      [点我收藏+]

咕咕咕

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mk make_pair
#define ll long long
using namespace std;

inline ll read()//快读
{
    ll sum = 0,p = 1;
    char ch = getchar();
    while(ch < 0 || ch > 9)
    {
        if(ch == -)
            p = -1;
        ch = getchar();
    }
    while(ch >= 0 && ch <= 9)
    {
        (sum *= 10) += ch - 0;
        ch = getchar();
    }
    return sum * p;
}

const int N=100005;
const int M=2e5+5;
int n,m,s;
int cnt,head[N];
ll dis[N];
bool vis[N];
struct edge
{
    int nxt,to;
    ll wei;
}e[M];
priority_queue< pair<ll,int> > q;

void add(int x,int y,ll z)
{
    e[++cnt].nxt=head[x];
    e[cnt].to=y;
    e[cnt].wei=z;
    head[x]=cnt;
}

void dijkstra()
{
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0;
    q.push(make_pair(0,s));
    while(q.size())
    {
        int x=q.top().second;
        q.pop();
        if(vis[x])
            continue;
        vis[x]=true;
        for(int i=head[x]; i; i=e[i].nxt)
        {
            int v=e[i].to;
            ll w=e[i].wei;
            if(dis[v]>dis[x]+w)
            {
                dis[v]=dis[x]+w;
                q.push(make_pair(-dis[v],v));
            }
        }
    }
}

int main()
{
    n=read(),m=read(),s=read();
    for(int i=1; i<=m; i++)
    {
        int u=read(),v=read();
        ll w=read();
        add(u,v,w);
    }
    dijkstra();
    for(int i=1; i<=n; i++)
        printf("%lld ",dis[i]);
    return 0;
}

 

dijkstra堆优化板子

原文:https://www.cnblogs.com/darlingroot/p/11743194.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!