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 ; }