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;
}

 

posted @ 2021-02-04 11:09  君与  阅读(41)  评论(0编辑  收藏  举报