過載運算子應用——堆優化dijkstra
阿新 • • 發佈:2019-01-09
#include<bits/stdc++.h> using namespace std; const int N=1e4+10; const int M=5e5+10; int n,m,s,tot,ver[M],Next[M],edge[M],lin[N],d[N]; struct node{ int val,x; }; bool operator<(const node &a,const node &b){ return a.val>b.val; } priority_queue<node>q; void add(int x,int y,int z){ ver[++tot]=y;Next[tot]=lin[x];lin[x]=tot;edge[tot]=z; } void dijkstra(){ d[s]=0;q.push((node){0,s}); while(q.size()){ node a=q.top(); int x=a.x,val=a.val; if(d[x]!=val) continue; for(int i=lin[x];i;i=Next[i]){ int y=ver[i]; if(d[y]>d[x]+edge[i]){ d[y]=d[x]+edge[i]; q.push((node){d[y],y}); } } } } int main(){ scanf("%d%d%d",&n,&m,&s); for(int i=1;i<=n;i++) d[i]=2147483647; for(int i=1;i<=m;i++){ int x,y,z;scanf("%d%d%d",&x,&y,&z); add(x,y,z); } dijkstra(); for(int i=1;i<=n;i++) printf("%d ",d[i]); cout<<endl; return 0; }