高度なアルゴリズムコンテストのガイドライングラフ理論の最短

341最適なトレード

問題の意味:画像、単方向および双方向の側縁、各ノードが固定量を有するが、n個の最大重量値との差を見つけるために行きました

最短でを置く理由(私は知らないが、明らかにBFSを解決することができます

双方向一方向側に加えて、注意を払うようにするだけでなく、抗存在する側の側面図を維持するために

BFS最小量が各ノードに1 Nから1を再度記録

次いで、各ノード1からnまでのnに最大の優先順位値を記録し、図のフランジをBFS再度実行

最後に、もう一度[OK]の最大差の統計情報を横断

書式#include <アルゴリズム> 
書式#include <iostreamの> 
の#include <cstdioを> 
する#include <cstdlib> 
書式#include <cmath> 
の#include <CStringの> 
の#include < 文字列 > 
の#include <マップ> 
書式#include <キュー> 
の#include <スタック> 
書式#include <リスト> 
の#include < 設定 >
 使用して 名前空間はstdを、
typedefの長い 長いLL。
typedefの対 <-1,11,11-> P。
typedefの長い ダブルLD;
MEM(X)のmemset(X、0、はsizeof(x))を
 #defineする私(X)のmemset(x、-1、はsizeof(X))
 の#define第Fiを提供して
 の#define SE第二
 の#define(I、N)のためのFO (i = 0; iがn <; I ++)
 の#define SC(X)のscanf( "%I64d"、およびX)
 の#define SCA(N、M)のscanf( "%I64d%I64d"、&N、&M)
 の#define PR (X)のprintf( "%I64dの\ n"、X)
 の#define PRI(X)のprintf( "%I64d"、X)
 の#define lowbit(x)はxおよび-x
 CONST LL MOD = 1E9 + 7 constの LLのOO = 1E18;
CONST LL N = 4E5 + 5 構造体ノード
{ 
    LLのNXT、であり;
} E [N]、E1 [N]。
LLヘッド[N]、CNT、VIS [N]、MI [N]、[N]、VI [N]、MX [N]。
[N]、CNT1 HEAD1 LL。
ボイド追加(U -1,11,11- V)
{ 
    E [CNT] .TO = V。
    E [CNT] .nxt = 頭部[U]。
    ヘッド[U] = CNT ++ 
} 
ボイドADD1(LL U、V LL)
{ 
    E1 [CNT1] .nxt = HEAD1 [U]。
    E1 [CNT1] .TO = V。
    HEAD1 [U] = CNT1 ++ 
} 

ボイドBFS(LL n)が
{ 
    キュー <LL> Q。
    q.push(1 )。
    VIS [ 1 ] = 1 
    MI [ 1 ] =分(MI [ 1 ]、[ 1 ])。
    一方、(q.size())
    { 
        LL U = q.front()。
        q.pop(); 
        (;〜I I = 11、I =ヘッド[U] E [I] .nxt)
        { 
            LLのV = E [I] .TO。
            MI [V] = 分(分(MI [V]、[V])、MI [U])。
            もし(!VIS [V])
            { 
                VIS [V] = 1 
                q.push(V); 
            } 
        } 
    } 
    q.push(N)
    VI [N] = 1 
    MX [N] = MAX(MX [N]、[N])。
    一方、(q.size())
    { 
        LL U = q.front()。
        q.pop(); 
        (LL I = HEAD1 [U];〜I; I = E1 [i]が.nxt)
        { 
            LLのV = E1 [i]の.TO。
            MX [V] = MAX(MAX(MX [V]、[V])、MX [U])。
            もし(!VI [V])
            { 
                VI [V] = 1 
                q.push(V); 
            } 
        } 
    } 
} 
int型のmain()
{ 
    LL I、J、K。
    LL N、M。
    U、V LL; 
    CIN >> N >> M。
    以下のために(i = 1 ; iが<= N; iは++ 
        CIN >> [i]は、MI [I] = OO、ヘッド[I] = - 1、MX [I] = - OO、HEAD1 [I] = - 1 ;
    一方、(M-- 
    { 
        CIN >> U >> V >> K。
        場合(k個の== 1 )(U、V)、ADD1(V、U)を加えます。
        他の(U、V)、ADD1(V、U)、(u、v)は、(V、U)を追加ADD1を追加します。
    } 
    BFS(N)
    LL ANS = 0 (i = 1 ; iが<= N; iは++)// coutの<< MI [I] <<」「<< MX [i]は<<てendl; 
    {
         場合(MI [I] = OO && MX [I] = - OO && MX [I]>!MI [i])と
            ANS = MAX(MX [I] - MI [i]は、ANS)。
    } 
    COUT << ANS << ENDL。
    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/op-z/p/11295093.html