2019アジア銀川まずラウンドオンラインプログラミングF.は上を移動します

トンのトピックのリンク:https://nanti.jisuanke.com/t/41290

アイデア:それはタイトルフロイドの意味を考えるのは簡単ですが、原因のリスクの制限のために、どのように我々はフロイドそれを実行することができます。

、誤解件名を開始U-思考> vは危険度を超えますが、サンプルでは見ることができないの出発点に終点を含み、唯一の都市の真ん中にはリスクを超えることはできませんようです。

我々は、すべての都市はリスクがありますが、フロイドのアルゴリズムの性質がマルチソースの最短パスを取得するには、最初のk個の都市の転送後jにiは、その後、私達はかもしれないと思うことができます

レコード番号とリスク市、その後リスク、再番号付けXianpaoフロイド小さなリスク、およびF [k]の程度によってソート都市は[i] [j]は都市を通してK最短経路を示し、

その後、我々は[K-1] F F [k]は[I] [J] =([K-1] F分[I]、[J]、[I] [NUM [] K] + F [K-を得ます1] [NUM [K] [J])、大プッシュの低リスクに対する危険度。

各お問い合わせは、我々は唯一のダウンfはリスクの上限を超えているリスクに街を、番号n個の都市をf [k]の外に走ったリスク[i]の[j]を横断する必要がある[k]は[ U] [V]、

私たちの答えがあります。


書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの> 
の#include <アルゴリズム> 
書式#include <キュー> 
の#include <マップ> 
書式#include <cmath>
 使用して 名前空間はstd; 

typedefの長い 長いLL。
#defineのINF 1E9用
 の#define担当者(I、J、K)(I =(J)がINT iが++; iが=(K)<)のため
 の#define()I =(J int型のためのrep __(i、j、k)を; iが<(k)を、i)が++
 の#define =(K); i--)I;あたり(i、j、k)を(I =(J int型用)>
 の#define __あたり(i、j、k)のため(I =(J)がINT; I>(K);

 ;
INT F [N] [N] [N]。
INTのN、Q。
int型U、V、W; 

構造体ノード{
     int型のID。
    int型ATKを。

    フレンドブール 演算子 <(CONSTノードと、CONSTノード&B){
         戻り a.ATKを< b.ATK。
    } 
} W [N]。

INT のmain(){ 

    int型のT。
    scanf関数(" %のD "、&T)。

    担当者(O、1 、T){ 
        scanf関数(" %D%dの"、&​​N、&Q)。

        担当者(I、1 、N){ 
            W [i]は.ID = I。
            scanf関数(" %のD "、&W [i]の.ATK)。
        } 

        ソート(W + 1、W + N + 1 )。

        担当者(I、1、n)の担当者(J、1 、N){
             場合(I == j)はF [ 0 ] [I] [J] = 0 ;
            他に F [ 0 ] [I] [J] = infファイル。
        } 

        担当者(I、1、n)の担当者(J、1 、N){ 
            scanf関数("%のD "、&W); 
            [F 0 ] [i] [j]は= Wは; 
        } 

        // 担当者(I、1、n)はCOUT << W [i]は.ATK << ENDL; 

        // 担当者(I 、1、N){
         //      担当者(J、1、n)はCOUT << F [0] [I] [J] << "「;
         //      COUT << ENDL;
         // } 

        担当者(K、1、 n)の担当者(I、1、n)の担当者(J、1 、n)は{ 
            F [k]は[I] [J] =分(F [K- 1 ] [I] [J]、F [K- 1 ] [i]は[W [K] .ID] + F [K- 1 ] [W [K] .ID] [J]); 
        } 

        のprintf(" ケース#1%のD:\ nは"O)、

         INT TMP; 
        担当者(I、1 、Q){ 
            scanf関数(" %D%D%D "、&​​U&V、およびW)
            TMP = 0 ; 
            担当者(J、1、n)の場合( W [J] .ATK <= W)TMP = J; 
            のprintf(" %Dを\ n " 、F [TMP] [U] [V]); 
        } 
    } 

    GETCHAR(); GETCHAR(); 
    戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/SSummerZzz/p/11468549.html