AcWing 342. 道路与航线
#include<bits/stdc++.h> using namespace std; const int N=2e5+5; int h[N],cnt,to[N],nxt[N],vis[N],n,r,p,s,d[N],a[N]; void add(int u,int v,int w){to[++cnt]=v;vis[cnt]=w;nxt[cnt]=h[u];h[u]=cnt;} void spfa() { deque<int>q; memset(d,0x3f3f3f3f,sizeof d); d[s]=0;a[s]=1; q.push_back(s); while(q.size()) { int u=q.front();q.pop_front(); a[u]=0; for(int i=h[u];i;i=nxt[i]) if(d[to[i]]>d[u]+vis[i]) { d[to[i]]=d[u]+vis[i]; if(!a[to[i]]) { a[to[i]]=1; if(d[to[i]]<=d[q.front()])q.push_front(to[i]); else q.push_back(to[i]); } } } } int main() { cin>>n>>r>>p>>s; int u,v,w; for(int i=1;i<=r;i++) { scanf("%d%d%d",&u,&v,&w); add(u,v,w);add(v,u,w); } for(int i=1;i<=p;i++) { scanf("%d%d%d",&u,&v,&w); add(u,v,w); } spfa(); for(int i=1;i<=n;i++) if(d[i]>=0x3f3f3f3f)puts("NO PATH"); else cout<<d[i]<<endl; return 0; }