1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| #include<bits/stdc++.h> using namespace std; const int N=1e6+5; int n,m,s; struct edge{ int to,next,v; }e[N<<1]; int tmp,head[N]; void add(int x,int y,int v){ e[++tmp].to=y; e[tmp].next=head[x]; e[tmp].v=v; head[x]=tmp; } bool vis[N]; int diss[N]; void SPFA(int s){ queue<int> q; memset(vis,0,sizeof vis); memset(diss,0x3f,sizeof diss); q.push(s); vis[s]=true; diss[s]=0; while(!q.empty()){ int cur=q.front(); q.pop(); vis[cur]=false; for(int i=head[cur];i;i=e[i].next){ int v=e[i].to; if(diss[cur]+e[i].v<diss[v]){ diss[v]=diss[cur]+e[i].v; if(vis[v]==0){ vis[v]=1; q.push(v); } } } } } int disf[1000][1000]; void floyd(){ memset(disf,0x3f,sizeof disf); for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ disf[i][j]=min(disf[i][j],disf[i][k]+disf[k][j]); } } } } struct node{ int pos,dis; inline bool operator <(const node &x)const{ return x.dis<dis; } }; int dis[N]; const int inf=0x3f3f3f3f; priority_queue<node> q; void dijkstra(int s){ q.push((node){s,0}); dis[s]=0; while(!q.empty()){ node cur=q.top(); q.pop(); if(vis[cur.pos]) continue; vis[cur.pos]=true; for(int i=head[cur.pos];i;i=e[i].next){ int v=e[i].to; if(dis[v]>dis[cur.pos]+e[i].v){ dis[v]=dis[cur.pos]+e[i].v; if(!vis[v]){ q.push((node){v,dis[v]}); } } } } } int main(){ cin>>n>>m>>s; for(int i=1;i<=n;i++) dis[i]=inf; for(int i=0;i<m;i++){ int u,v,d; scanf("%d%d%d",&u,&v,&d); add(u,v,d); } dijkstra(s); for(int i=1;i<=n;i++) printf("%d ",dis[i]); return 0; }
|