CSP-sの模擬テスト98 "昼食"

本当に診察室の外には何も考えていません

暴力は右再生できませんでした、私は絶望的です

幸い、私は今少しになります

奇妙なサブタスクがあります:何もありません決定していない学んだ同級生がんアルゴリズムは。

この子は役に立たないと思われるタスクの性質に見えます

私たちは、プッシュすることができます

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])))。
    }
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/znsbc-13/p/11787412.html