ICPC最適化銀川H.配達ルートSFPA

問題の説明

ポニーは、宅配会社の上司です。会社のニーズは1からnまでの番号n個のオフィスにパッケージを提供します。特に、s番目のオフィスは、宅配会社の乗換駅です。X通常の双方向の道路とこれらのオフィス間のy一方向の道路があります。彼らは、i番目の道路を通過する場合の配信バンは、CIの電力を消費します。一般的には、1つの道路上の消費電力は非負でなければなりません。しかし、実験的な充電レールのおかげで、消費量は、いくつかの一方向の道路上の負でもよいです。また、ポニーは、以下の公開情報を得ました。関連部門は、BIへの愛から一方通行がある場合、AIへの双方向から復帰することは不可能であることを約束しました。道路上の固定デリバリーバンを避けるために、Xiaodaoは、これらの事業所への搬送ステーションからこれらの最低の消費電力を見つけたいです

入力

最初の行は、4つの整数N(1≤N≤25000)を含有します。バツ; Y(1≤X; Y≤50000)、およびS(1≤S≤N)。これは3つの整数を含む各ラインがai X + Y行が続いています。BI(1≤aiを、BI≤N; 6 = BI AI)道路を説明すると、CI(-10000≤CI≤10000)を。道路所与の最初のxは、通常の双方向の道路であり、そして最後のy所定の道路が一方通行道路です。

出力

i番目の事務所に到達することは不可能である場合に出力が含まれている必要がありますnは、可能な場合の線は、i番目の行は、i番目のオフィスにs番目から最小のエネルギー消費量を表し、または出力「NOパス」。

サンプル入力

6 3 3 4
1 2 5
3 4
5 6 10
3 5 -100
4 6 -100
1 3 -10

サンプル出力

PATH NO
NOのPATHない
50
-95
-100

アイデアの分析

受け入れられたコード


#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<set>
#include<queue>
using namespace std;
const int N=1e6;
int p[N],w[N],head[N],nex[N],e=1;
void add(int a,int b,int c){
    p[e]=b;
    nex[e]=head[a];
    head[a]=e;
    w[e++]=c;
}
 
long long dp[100010],val=0;
int q[20000010],l,r,vis[100010];
void bfs(int s,int n){
     int i,u,v;
     for(i=1;i<=n;i++) dp[i]=1e18;
     dp[s]=0;
     l=r=1e7;
     q[l]=s;
     vis[s]=1;
     while(l<=r){
        u=q[l];
        vis[u]=0;
        l++;
        for(i=head[u];i;i=nex[i]){
            v=p[i];
            if(dp[v]>dp[u]+w[i]){
                dp[v]=dp[u]+w[i];
                if(vis[v]==0){
                    if(l>r) q[++r]=v;
                    else{
                        if(dp[q[l]]+val<dp[v]) q[++r]=v;
                        else q[--l]=v;
                    }
                    vis[v]=1;
                }
            }
        }
     }
     for(i=1;i<=n;i++){
        if(dp[i]==1e18) printf("NO PATH\n");
        else printf("%lld\n",dp[i]);
     }
}
 
int main(){
    int i,n,x,y,s,a,b,c;
    scanf("%d%d%d%d",&n,&x,&y,&s);
    for(i=1;i<=x;i++){
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
        add(b,a,c);
        val+=2*c;
    }
    for(i=1;i<=y;i++){
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
        val+=c;
    }
    val=sqrt(val)/100;
    bfs(s,n);
    return 0;
}

参考ブログ:

おすすめ

転載: www.cnblogs.com/hezongdnf/p/11967069.html