Dijkstra(n log(n))优先队列优化+链式前向星

来源:互联网 发布:sqlserver可视化工具 编辑:程序博客网 时间:2024/06/14 01:33
#include<bits/stdc++.h>using namespace std;const int maxn=500000+10,inf=214748364;int n,m;int e,begin[maxn*2],to[maxn],next[maxn],w[maxn];struct node{int a,b;bool operator < (const node& u)const{return b>u.b;}};inline void add(int x,int y,int z){to[++e]=y;next[e]=begin[x];begin[x]=e;w[e]=z;}int d[maxn],p[maxn];inline void Dijkstra(int s){memset(d,0x3f3f3f,sizeof(d));priority_queue<node> q;d[s]=0;q.push((node){s,0});while(!q.empty()){node tmp=q.top();q.pop();if(p[tmp.a])continue;p[tmp.a]=1;for(int i=begin[tmp.a];i;i=next[i]){if(d[to[i]]>d[tmp.a]+w[i]){d[to[i]]=d[tmp.a]+w[i];q.push((node){to[i],d[to[i]]});}}}}int main(){int i,j,k;freopen("Dijkstra.in","r",stdin);freopen("Dijkstra.out","w",stdout);int s;scanf("%d%d%d",&n,&m,&s);int x,y,z;for(i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);add(x,y,z);}Dijkstra(s);for(i=1;i<=n;i++){if(i!=1){if(d[i]==1061109567)cout<<" "<<2147483647;else cout<<" "<<d[i];}else {if(d[1]==1061109567)cout<<2147483647;else cout<<d[i];}}cout<<endl;return 0;}

1 0