1. 程式人生 > >[洛谷3371&&4779]【模板】單源最短路徑

[洛谷3371&&4779]【模板】單源最短路徑

題目

https://www.luogu.org/problemnew/show/P3371
[P3371 【模板】單源最短路徑(弱化版)]
https://www.luogu.org/problemnew/show/P4779
P4779 【模板】單源最短路徑(標準版)



程式碼標準版本(dij+堆優化)

#include<cstdio>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
const int N=100010,M=200010; 
struct
node{int y,z,next;}a[M]; int head[N],n,m,tot,root,d[N]; bool v[N]; priority_queue<pair<int,int> >q; inline int read() { int p=0; char c=getchar(); while (!isdigit(c)) c=getchar(); while (isdigit(c)) p=(p<<3)+(p<<1)+c-48,c=getchar(); return p; } void write(int x){if (
x>9) write(x/10); putchar(x%10+48);} void add(int x,int y,int z){a[++tot]=(node){y,z,head[x]}; head[x]=tot;} void dijkstra() { memset(d,0x3f,sizeof(d)); memset(v,0,sizeof(v)); d[root]=0; q.push(make_pair(0,root)); while (q.size()){ int x=q.top().second; q.pop(); if (v[x]) continue; v[x]=1; for
(int i=head[x];i;i=a[i].next){ int y=a[i].y,z=a[i].z; if (d[y]>d[x]+z) { d[y]=d[x]+z; q.push(make_pair(-d[y],y)); } } } } int main() { n=read(),m=read(),root=read(); for (int i=1;i<=m;i++) { int x=read(),y=read(),z=read(); add(x,y,z); } dijkstra(); for (int i=1;i<=n;putchar(' '),++i) write(d[i]); }