F.牛乳工場

F.牛乳工場

https://codeforces.com/group/5yyKg9gx7m/contest/269908/problem/F

件名の説明:

そこに1,2-として順番に番号n点であり、.... N。入力のn-1、A、Bの対つつ。Bは場所からの到達範囲を表しています。ポイントの最小数iが存在する場合に掲載し、いずれかから出発点になり、最終的にi点に到達することができます。-1出力の不在。

分析:

単方向図。まず、隣接行列預金を持ちます。心は本当であるに到達することができます。その後、各点について、BFSとのポイントは、間接的にも真のラベルに達します。ポイント1は、2、3、1にも間接的に2に到達することができます達することができた場合でも、何が、例えば、剪定を必要とします。その後、再びノー感覚3-2によります。その後、再び2つのBFSは必要ありません。

コード:

書式#include <stdio.hに> 
する#include <CStringの> 
の#include <アルゴリズム> 
書式#include <キュー> 
の#include <cmath> 
の#include <iostreamの>
 使用して 名前空間をSTD。
ブールマップ[ 105 ] [ 105 ]。
int型のmain()
{ 
    int型、nは 
    cinを >> N;
    以下のためにINT iが= 0 ; iが<N- 1 ; I ++ 
    { 
        int型、B、。
        scanf関数(" %D%D "、&​​、&B)。
        [A] [B]マッピング = 
    } 
    キュー < INT > Q。
    以下のためにINT iが= 1 ; I <= N; I ++ 
    { 
        ためINT J = 1 ; J <= nであり、j ++ 
        { 
            場合(I == j)を続けますもし(マップ[I] [J])
            { 
                q.push(J)。
            } 
        } 
        ながら(!q.empty())
        { 
            int型、W = q.front()。
            q.pop();
            マップ[i]は[W]= ;
            int型のk = 1 ; K <= N; K ++ 
            { 
                場合(K == w)を続けますもし(!マップ[W] [K] && マップ[i]が[K])
                { 
                    q.push(K)。
                } 
            } 
        } 
    } 
    ブール値 ですBOOL ISP = ;
    INTは iは= 1 ; <I = N; ++ I 
    { 
        ある = ;
        INT J = 1 ; J <= nであり、j ++ 
        { 
            場合(I == j)を続けます場合(!マップ[J] [i])と
            { 
                ある = falseが休憩; 
            } 
        } 
        場合である
        { 
            のprintf(" %dの\ n " 、I)。
            ISP = ;
            休憩; 
        } 
    } 
    もし(!ISP)のprintf("-1 \ n " );
     戻り 0 ; 
}

 

 

おすすめ

転載: www.cnblogs.com/studyshare777/p/12354107.html