CSU1081는 그래프 BFS 지시

팀 그룹

설명
중앙 남부 대학 ACM 여름 훈련 캠프는 교육의 모든 선수 'N 이름을 것입니다 시작됩니다 두 그룹으로 나누어 순위 훈련에 의해 시험 (각각 1, 2, ..., N으로 번호), 전 선수가 K로 나누어 그룹 A는 나머지 그룹 멤버들로 분할 B.

하지만 지금은 코치가 실수로 순위 훈련 시험을 잃었 CSGrandeur하지만 그룹 A와 B 그룹 직원을 결정하기 전에되지 않은 후 CSGrandeur 교육 직원을 요청하려는 어떤 순서로 각 순위에 플레이어의 그룹이 무엇인지를 결정합니다.

선수가 먼지로 순위 훈련을하고 있습니다 그러나, 단지 막연하게 어떤 사람들은 여기에 M 메시지 CSGrandeur의 최종 총에 다시 자신의 뒤쪽에 온 기억 튜플을 사용하여 각 메시지 (X, Y) (X! = y)는 X 플레이어 기억보다 더 후 자신의 의지의 y 위 선수를 의미했다.

이제 CSGrandeur 알고 싶은 정보의 M 조각에 따라, 당신은 선수 그것의 그룹 여부를 확인할 수 있습니까? (기본적으로 모든 정보가 사실과 선수 훈련에 반영됩니다.)

입력
테스트 데이터의 복수의 세트를 포함하는 입력.

각 시험의 첫 번째 행은 세 개의 양의 정수 N 포함 (2 <= N <= 1000), K (1 <= K <= N), M (1 <= M <= 10000), 상기 문헌을 의미한다. 다음 M 라인은 각각 두 개의 양의 정수의 X, Y가 (1 <=의 X, Y <= N이고, X가! = Y)은, X, Y의 각각의 쌍에 대해, 정보의 M 개를 설명 x는 각각의 이름을 나타낸다 나는에 의존 자신의 소유가 아닌 Y 후 순위의 첫 번째 팀 선수를 기억한다.

출력
A 군의 구성원, 출력 "YES"(따옴표 제외)를, 그렇지 않으면 (따옴표없이)를 "NO"로 출력하는 경우 각 시험은 결정될 수있다.

샘플 입력

3 1 2 
1 2 
1 3 

3 2 2 
1 2 
1 3

샘플 출력

YES 
NO

힌트

아이디어 : 그는 전달할 수 있습니다 얼마나 많은 사람들이 판단 할 수있는 모든 인접리스트에 대한 검색을 수행하는 경우보다 크거나 같은 나노 미터의 지점, 그 이름의 m.

#INCLUDE <비트 / STDC ++ H.>
 은 USING  공간 STD;
 CONST의  INT MAXN = 1E5 + 5. ]
 int로 먼저 [MAXN을, 다음 [MAXN, 에지 [MAXN] [ 2 ]
 int로 VIS [MAXN]
 int로 추가를 ( INT의 , INT의 B, INT의 c) 
{ 
    다음 [C] = 제 [A]; //으로 다음의 최초 발생에 가리키는 정보] 
    제 [A] =의 C를 // 태그 C 현재 메시지에 나타나는 
    에지 [C] [ 0 ] = a 및 
    에지 [C] [ 1. =] B] 
}  < INT > Q 단계;
INT BFS ( INT I) 
{ 

    memset 함수 (힘, 0 , 는 sizeof (힘));
    동안 (! q.empty ()) 
        q.pop (); 
    q.push (I); 
    INT CNT = 0 ; 
    힘 [I] = 1 ;
    반면 (! q.empty ()) 
    { 
        INT t = q.front (); 
        q.pop (); 
         ( INT의 J = 제 [t] J =! - 1 ; J = 다음 [J]) 
        { 
            경우 (힘 [에지 [J] [ 1 ]] == 0 )
            {
                힘 [에지 [j를] [ 1 ] = 1 ; 
                q.push (에지 [J] [ 1 ]); 
                CNT ++ ; 
            } 
        } 
    } 
    반환 탄소 나노 튜브를; 
} 
INT 의 main () 
{ 
    INT의 N, M, K;
    INT의 XX, YY;
    반면 (는 scanf ( " % D % D % D " !, N, M, K) = EOF) 
    { 
        memset 함수 (제 1, - 1 , 를 sizeof 제 ()); 
        memset 함수 (다음, 0 , sizeof 연산자(다음 것));
        INT CNT1 = 0 ;
        위한 ( int로 I = 0 ; I <K가 나는 ++ ) 
        { 
            는 scanf ( " %의 D % d에 " , XX, YY)을; 
            (YY, XX, ⅰ) 추가; 
        } 
        에 대해 ( int로 I = 1 <; ++ i가 N = 난 ) 
        { 
            경우 (BFS (I) = (N-> m)) 
            { 
                CNT1 ++ ; 
            } 
        } 
        경우 (CNT1> = m) 
            의 printf ( " YES \ n을" ),
         다른 원인 
            의 printf ( " NO \ n을 ' ); 
    } 
}

 

추천

출처www.cnblogs.com/wakaka12345/p/11470631.html