NC50381 道路和航线 (spfa+slf优化)

题目链接
题目大意:很简单,从源点s到其它所有点的最短距离,就是单源最短路的模板。
分析:很板子,只不过需要加一下slf优化,不然超时,就是为了记录一下。

#include<bits/stdc++.h>
#define MAIN main
#define PII pair<int,int>
#define x first
#define y second
using namespace std;
typedef long long ll;
const double eps=1e-8;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int N=3e4+10,M=1e5+10;
struct edge
{
    
    
    int v,next,w;
}e[M<<1];
int head[N],cnt;
void add(int u,int v,int w)
{
    
    
    e[++cnt].v=v;
    e[cnt].w=w;
    e[cnt].next=head[u];
    head[u]=cnt;
}
int dis[N],vis[N],n,r,p;
void spfa(int s)
{
    
    
    deque<int>q;
    q.push_back(s);
    for(int i=1;i<=n;i++) vis[i]=0,dis[i]=inf;
    vis[s]=1;
    dis[s]=0;
    while(!q.empty())
    {
    
    
        int u=q.front();
        q.pop_front();
        vis[u]=0;
        for(int i=head[u];i;i=e[i].next)
        {
    
    
            int v=e[i].v;
            if(dis[v]>dis[u]+e[i].w)
            {
    
    
                dis[v]=dis[u]+e[i].w;
                if(!vis[v]){
    
    
                    if(q.empty()) q.push_back(v);
                    else if(dis[q.front()]<dis[v]) q.push_back(v);
                    else q.push_front(v);
                    vis[v]=1;
                }
            }
        }
    }
}
int MAIN()
{
    
    
    int s;
    scanf("%d%d%d%d",&n,&r,&p,&s);
    for(int i=1;i<=r;i++){
    
    
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
        add(v,u,w);
    }
    for(int i=1;i<=p;i++){
    
    
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
    }
    spfa(s);
    for(int i=1;i<=n;i++){
    
    
        if(dis[i]==inf) printf("NO PATH\n");
        else printf("%d\n",dis[i]);
    }
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/amazingee/article/details/113567894