本当に診察室の外には何も考えていません
暴力は右再生できませんでした、私は絶望的です
幸い、私は今少しになります
奇妙なサブタスクがあります:何もありません決定していない学んだ同級生がんアルゴリズムは。
この子は役に立たないと思われるタスクの性質に見えます
私たちは、プッシュすることができます
Lは貪欲取ることができます
何の感情的な理解の証明
次いで、F [X] =分([x]は、L F)
最短の形態は、最短で転送することができます
そして、このサブタスクは促進します
何の学生が存在しない場合は、がんアルゴリズムに学ぶ上でプラス譲渡制限に相当します
例えば
既存のWWB、WHS 2
既知の癌WWB学習アルゴリズムの時間は> Rは、それは癌がWHSアルゴリズムを食べていないことを意味する場合
それでも貪欲と考えられ
制限を満たすためにLにWHSとWWB 2食、L + 1、次に学ぶためのがんアルゴリズムでWHS、
従ってLIM [X] = MAX(L + 1)
LIMは、最初に計算し、次にfはそれを転送します
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineは長い長いでしょ #defineし 1111111 LLのN、M、TOT。 LL VIS [A]、MN [A]、MX [A]、ヘッド[A]、NXT [A]、版[A]、DIS [A]、フラグ[A]、LST [A]、LIM [A] ; 構造体ノード{ LL、X、Y、L、R。 ノード(){} ノード(CONST LL&、CONST LL&B、CONST LL&C、CONST LL&D){Xが=、YはB、L = C、R = = dは;} } U [A]。 ボイド追加(LLのX、LLのY、LLミネソタ州、LL MAXX){ NXT [ ++すべて] =頭部[X]版は、[すべて] = Y、ヘッド[X] =全世界は[すべて] =ミネソタ州、X [すべて] = MAXX。 } ボイドpre_spfa(){ 両端キュー <LL> Q; 以下のために(LL i = 1 ; iが<= N; iは++します){ scanf関数(" %のLLD "、およびLST [I])。 もし(LST [I] == - 1)LIM [I] = 1E9 + 7、VIS [I] = 1 、q.push_back(I)。 他 VIS [I] = 0 ; } しばらく(!q.empty()){ LL X = q.front(); q.pop_front()。 VIS [X] = 0 。 用(; I; I = 11、I =ヘッド[X] NXT [I]){ LLのY =版[i]は、ミネソタ州= MN [i]は、MAXX = MX [I]。 もし(LIM [X]> MAXX){ 場合(LIM [Y] <ミネソタ+ 1 ){ ペースト[Y] =ミネソタ+ 1 。 もし(!ビュー[Y]){ VIS [Y] = 1 。 q.push_back(Y)。 } } } } } } ボイドspfa(){ 両端キュー <LL> Q; 用(LL i = 1 ; iが<= N; iが++ ) VIS [I] = 0、DIS [I] = 1E9 + 7 。 DIS [ 1 ] = 0 ; q.push_back(1 )。 しばらく(!q.empty()){ LL X = q.front(); q.pop_front()。 VIS [X] = 0 。 用(; I; I = 11、I =ヘッド[X] NXT [I]){ LLのY =版[i]は、ミネソタ州= MN [i]は、MAXX = MX [i]は、G = MAX(MAX(LIM [Y]、ミネソタ州)、DIS [X])。 // のprintf( "Y =%LLDミネソタ州=%LLD MAXX =%LLD G =%LLD \ n"は、Y、ミネソタ州、MAXX、G)。 もし(DIS [Y]> G && G <= MAXX){ DIS [Y] = G。 // のprintf( "DIS [%のLLD] =%LLDする\ n"、Y、DIS [Y])。 もし(!VIS [Y]){ VIS [Y] = 1 。 q.push_back(Y)。 } } } } } INT {main()の freopenは(" lunch.in "、" R " 、STDIN)。 freopenは(" lunch.out "、" W " 、STDOUT)。 scanf関数(" %のLLDの%のLLD "、&N、&M)。 用(LL I = 1 ; I <= M; iは++ ){ LL、X、Y、B。 scanf関数(" %LLD%LLD%LLD%LLD "、およびX&Y、&、&B)。 (X、Y、A、B)を加えます。 (Y、X、A、B)を加えます。 U [I] = ノード(X、Y、A、B)。 } pre_spfa(); spfa(); 用(LL i = 1 ; iが<= N; iが++ ) 場合(LSTは、[I] == 1 && DIS [I]> 1E9){ プット(" インポッシブル\ nを" ); リターン 0 ; } 用(LL I = 1 ; I <= M; iは++ ){ LL X = U [i]を.X、Yは= U [i]の.Yと、 もし( - LST [X] == 1 && DIS [Y] < [I] .L U){ プット(" インポッシブル\ nを" ); リターン 0 ; } もし(LST [Y] == - 1つの && DIS [X] < U [i]の.L){ プット(" インポッシブル\ nを" ); リターン 0 ; } } // (; iは<= N I ++はLL I = 1)のための // のprintf( "LIM =%LLD DIS =%LLD \ n"は、LIM [i]は、DIS [I])。 用(LL I = 1 ; I <= M; iは++ ){ LL X = U [i]を.X、Yは= U [i]の.Yと、 もし(LST [X] == - 1隻の || LST [Y] == - 1)のprintf(" %LLDする\ n " 、U [i]の.L)。 他のprintf(" %LLDの\ nを"、MAX(DIS [x]は、DIS [Y])> U [i]は.R?U [i]は.L:最大(U [i]が.L、最大の(DIS [ X]、DIS [Y])))。 } }