F. 우유 공장

F. 우유 공장

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

 

 

추천

출처www.cnblogs.com/studyshare777/p/12354107.html