单源最短路---dijkstra模板(二叉堆优化)

来源:互联网 发布:云计算安全问题实例 编辑:程序博客网 时间:2024/06/01 08:39

题目描述

代码

#include <cstdio>#include <cstdlib>#include <queue>#define open(s) freopen(s".in","r",stdin); freopen(s".out","w",stdout);#define close fclose(stdin); fclose(stdout);using namespace std;struct node{    int pos;    long long d;    bool operator < (const node &b) const    {        return d>b.d;    }};struct Edge{    int to;    int next;    int w;};int n,m;int cnt;long long d[10005];int head[10005];bool f[10005];Edge edge[500005];void add(int x,int y,int z){    ++cnt;    edge[cnt].next=head[x];    edge[cnt].w=z;    edge[cnt].to=y;    head[x]=cnt;}void dijkstra(int s){    priority_queue<node>q;    q.push((node){s,0});    for(int t=1;t;)    {        int p=q.top().pos; q.pop(); --t;        if(f[p]) continue;        f[p]=1;        for(int i=head[p];i;i=edge[i].next)        if(d[edge[i].to]>d[p]+edge[i].w)        {            d[edge[i].to]=d[p]+edge[i].w;            q.push((node){edge[i].to,d[edge[i].to]}); ++t;        }    }}int main(){    open("3371");    int s;    scanf("%d %d %d",&n,&m,&s);    for(int i=1;i<=n;++i)        d[i]=2147483647;    d[s]=0;    for(int i=1;i<=m;++i)    {        int x,y,z;        scanf("%d %d %d",&x,&y,&z);        add(x,y,z);    }    dijkstra(s);    for(int i=1;i<=n;++i)        printf("%lld ",d[i]);    close;    return 0;}
阅读全文
0 0
原创粉丝点击