問題の意味:画像、単方向および双方向の側縁、各ノードが固定量を有するが、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 ; }