復興「問題解決レポート」

P1119再建

Luogu P1119

問題の意味

一度、各村は地震によって破壊されたN M道路村、ある\(T_Iの\)修復されます。それが接続した場合にのみ、特定のルートのために、二つの村が通過するように修復されています。qが、頼む二つの村の間でいくつかのポイントの最短経路をお願いしています。

最初の行は、2つの正の整数が含まれ\(N-、m個の\を)

2行目は含ま\(N- \)非負整数(T_0、T_L、...、N-T_ {}。1 \)\、時間の各村の完全な再構成を示す、そのデータを保証するために、\(T_0≤T_1≤...≤をT_ {N-1} \)

\(m個\) 3つの非負の整数の行\(I、J、W \)、\ (w≤10000\)を表し村がある接続\(I、Jの\)路長が\(\ w)のことを確実にするために、\を(iはJ \をNEQ \) 唯一の村の任意のペアのための経路が存在します。

次に、正の整数\(q個の\)を表し、\(q個の\)問い合わせTHが。

\(Q \) 3非負整数の列\(X、Y、T \) 最初に尋ねる(T \)\を村から、日\(X \)村に\(Y \)ことを保証するデータの最短経路の長さ\(T \)は減少しません。

解決

最初の愚かで最も短絡をDijを書いてください。正の解はフロイドであることが判明した後、Tが判明しました!

尋問ので\(T \)が低下しない場合、それは、順番村に修復される\(T_I \のLeq T \)は、その後、1の数が〜私は村の再構築が完了しています。

したがって、フロイド、場合村\(K \)との再構成が完了した後、\(K \)緩和操作。

明らかに村が一度に再構築されるので、複雑です\(O(N ^ 3) \) それがあります。

Dijとは\(O(Q \のCDOT n個の\ log_2は(N))\) 明らかに受け入れられません。

コード

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;

long long n,m,q;
long long t[500];

long long k=1;

long long mape[500][500];

int main() {
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;++i) 
        for(int j=1;j<=n;++j) 
            mape[i][j]=0x7fffffff;
    for(int i=1;i<=n;++i) scanf("%lld",&t[i]);
    for(int i=1;i<=m;++i) {
        long long x,y,z;
        scanf("%lld%lld%lld",&x,&y,&z);
        mape[x+1][y+1]=z;
        mape[y+1][x+1]=z;
    }
    scanf("%lld",&q);
    while(q--) {
        long long x,y,z;
        scanf("%lld%lld%lld",&x,&y,&z);
        ++x;++y;
        for(;t[k]<=z&&k<=n;++k)
            for(int i=1;i<=n;++i)
                for(int j=1;j<=n;++j) {
                    mape[i][j]=min(mape[i][j],mape[i][k]+mape[k][j]);
                    mape[j][i]=min(mape[j][i],mape[j][k]+mape[k][i]);
                }
        if(mape[x][y]<0x7fffffff&&t[x]<=z&&t[y]<=z) printf("%d\n",mape[x][y]);
        else printf("-1\n");
    }
}

おすすめ

転載: www.cnblogs.com/JHTBlog/p/11408977.html