这里在附上引用中大佬的代码,他的代码中没有绿色节点。
int n,m,s,id[N],cnt; struct Node {int l,r;}t[N]; void build(int p,int l,int r) { t[p].l=l, t[p].r=r; if(l==r) { id[l]=p; return; } add(p,p*2,0), add(p*2+n*4,p+n*4,0); add(p,p*2+1,0), add(p*2+1+n*4,p+n*4,0); build(p*2,l,(l+r)/2), build(p*2+1,(l+r)/2+1,r); } void adds(int p,int x,int y,bool type,int u) { int l=t[p].l, r=t[p].r, mid=((l+r)>>1); if(l==x&&y==r) { if(!type) return add(u,p,0); else return add(p+4*n,u,0); } if(y<=mid) adds(p*2,x,y,type,u); else if(x>mid) adds(p*2+1,x,y,type,u); else adds(p*2,x,mid,type,u), adds(p*2+1,mid+1,y,type,u); } int d[N]; void bfs() { deque<int>q; q.push_front(s); memset(d,0x3f,sizeof(d)); d[s]=0; while(!q.empty()) { int u=q.front(); q.pop_front(); for(int i=hd[u],v;i;i=e[i].nxt) if(d[v=e[i].to]>d[u]+e[i].w) { d[v]=d[u]+e[i].w; if(!e[i].w) q.push_front(v); else q.push_back(v); } } } signed main() { scanf("%d%d%d",&n,&m,&s); build(1,1,n); cnt=8*n; for(int i=1,a,b,c,dd;i<=m;i++) { scanf("%d%d%d%d",&a,&b,&c,&dd); int x=++cnt, y=++cnt; add(y,x,1), adds(1,c,dd,0,x), adds(1,a,b,1,y); x=++cnt, y=++cnt; add(y,x,1), adds(1,a,b,0,x), adds(1,c,dd,1,y); } for(int i=1;i<=n;i++) add(id[i],id[i]+4*n,0), add(id[i]+4*n,id[i],0); s=id[s]+4*n; bfs(); for(int i=1;i<=n;i++) printf("%d\n",d[id[i]]); return 0; } 引用:https://www.luogu.com.cn/blog/forever-captain/DS-optimize-graph