https://codeforces.com/group/5yyKg9gx7m/contest/269908/problem/F
주제 설명 :
1,2-가 순차적으로 번호 N 포인트, .... N이다. 입력 N-1, A, B의 쌍있다. B는 장소의 범위를 나타냅니다. 이 점의 최소 번호, A I 어떤에서 출발 지점을 만드는 경우 결국 소수점 내가 도달 할 수 요청합니다. -1 출력의 유무.
분석 :
단방향도. 먼저 인접 행렬 예금. 도달 할 수있는 마음은 사실이다. 그런 다음, 각 포인트에 대한, BFS와 점은 간접적으로도 진정한 표시에 도달합니다. 포인트 1은 2, 3, 1 간접적으로이 도달 할 수에 도달 할 수있었습니다하면 어떻게 예를 들어, 가지 치기가 필요합니다. 그런 다음 다시 아무 의미 3-2. 그런 다음 다시 2 BFS 필요가 없다.
코드 :
#INCLUDE <STDIO.H> #INCLUDE <CString을> #INCLUDE <알고리즘> #INCLUDE <큐> #INCLUDE <cmath> #INCLUDE <iostream> 사용 공간을 성병; 부울 맵 [ 105 ] [ 105 ]; int로 주 () { INT에 해당하는 단계; CIN >> N; 위한 ( INT 나는 = 0 ; 나는 <N- 1 ; I ++ ) { INT B, A; scanf와 ( " % D % D ' , A, 및 B); [A]는 [B]를 매핑 = 참 ; } 큐 < INT > Q; 위한 ( INT 난 = 1 ; I <= N; I ++ ) { 대 ( INT J = 1 ; J <= N; J ++ ) { 경우 (I == J) 계속 ; 경우 (MAP [I] [J]) { q.push (j); } } 동안 (!의 q.empty ()) { INT w = q.front (); () q.pop; [I] [W]를 매핑= 진정한 ; 대 ( INT에 K = 1 ; K <= N, K ++ ) { 경우 (K == W는) 계속 ; 만약 MAP ([K] && [w]! 맵 [I] [K]) { q.push (K); } } } } BOOL는 이고 ; 불리언 ISP = 거짓 ; 위한 ( INT 난 = 1 ; i가 <= N; 내가 ++ ) { 하다가 = 참; 대 ( INT J = 1 ; J <= N; J ++ ) { 경우 (I == J) 계속 ; 만약 (! 맵 [J] [I]) { 하다가 = 거짓 ; 휴식 ; } } 경우 ( 인 ) { 의 printf ( " 가 % d \ n " , I); ISP = 진정한 ; 휴식 ; } } 경우(! ISP)의 printf ( " -1 \ n " ); 반환 0 ; }