POJ 1611 --- 용의자 (분리 된 세트)

중증 급성 호흡기 증후군 (SARS), 알 수없는 병인의 비정형 폐렴은 다른 사람에게 전송을 최소화하기 위해 월 중순 2003 년 글로벌 위협으로 인식하고, 최선의 전략은 다른 사람에서 용의자를 분리하는 것입니다. 
에서 안 - 확산 - 네 - 질병 대학 (NSYSU), 많은 학생 그룹이 있습니다. 같은 그룹의 학생들은 자주 서로 서로 왕래하고, 학생이 여러 그룹에 가입 할 수 있습니다. SARS의 가능한 전송을 방지하기 위해, NSYSU는 모든 학생 그룹의 회원 목록을 수집하고 자신의 표준 운영 절차 (SOP)에 다음과 같은 원칙으로한다. 
그룹의 회원이 의심되면, 그룹의 모든 구성원은 용의자입니다. 
그러나, 그들은 학생이 용의자로 인식 될 때 모든 용의자를 쉽게 식별 할 수 없다는 사실을 알게 될 것입니다. 당신의 임무는 모든 용의자를 발견하는 프로그램을 작성하는 것입니다.

입력

입력 파일은 여러 경우를 포함한다. 각 시험은 n이 학생 수는 라인에있는 두 정수 n 및 m으로 시작하고, m은 그룹의 수이다. 당신은 가정 수 0 <N <= 30000과 모든 학생은 0에서 N-1, 그리고 처음에 학생 0 모든 경우에 용의자로 인식 사이에 고유 한 정수로 번호가 <= m <= 500 0. 이 라인은 m의 그룹 멤버리스트, 그룹 당 하나 개의 라인으로 이어진다. 각 광고 그룹의 멤버의 수를 나타내는 자체 정수 K로 시작한다. 회원의 수에 따라,이 그룹의 학생들을 대표하는 K 정수가 있습니다. 라인의 모든 정수는 적어도 하나의 공백으로 구분된다. 
N = 0, m = 0 인 경우와 입력의 종료를 표시하고, 처리 될 필요가 없다.

산출

각각의 경우에 대해, 하나 개의 출력 라인에서 용의자의 수.

샘플 입력

100 4 
2 1 2 
5 10 13 11 12 14 
2 0 1 
2 99 2 
200 2 
1 5 
5 1 2 3 4 5 
1 0 
0 0

샘플 출력

4 
1 
1

질문의 의미 :

N 학생, m 그룹이, 사람이 아픈 병이 처음 0이있을 수 있습니다 그룹 전체가 동시에 아픈 수 있으며, 많은 사람들이 여러 그룹, 소규모 그룹에서 아픈이 될 수 있는지 물었다.

아이디어 :

연결되지 않은 세트, 최종 수집 영을 추구하는 사람들의 같은 수의

1 #INCLUDE <STDIO.H>
 2 #INCLUDE < 문자열 .H>
 3  
4  INT의 전 [ 30004 ];
5  INT의 합 [ 30004 ];
6  
7  공극 INIT ( INT의 N)
 8  {
 9      INT I;
(10)      에 대한이 (I = 0 ; I는 <= N; ++ i가 )
 11      {
 12          미리 [I] = I;
13          합 [I] = 1 ;
14      }
 15  }
 16  
17  INTfind_pre ( INT X)
 18  {
 19 일      경우 (프리 [X] == x)를 리턴 X;
20      다른  반환 = 프리 [X]를 find_pre (프리 [X]);
21  }
 22  
23  INT () 주
 24  {
 25      INT의 N, m, I, NUM;
26      INT의 XX, YY, 뿌리, X;
27 일      동안 (~는 scanf ( " %의 D % d에 " , N, m) && (N || m))
 28      {
 29          INIT (N);
30           (I = 0 ; I <m은, 내가 ++ )
31          {
 32              는 scanf ( " %의 D " , NUM);
33              는 scanf ( " %의 D " , 루트);
34              YY = find_pre (루트);
35              num-- ;
36              동안 (num-- )
 37              {
 38                  는 scanf ( " %의 D ' , X);
39                  XX = find_pre (X);
40                  경우 (XX! =YY) // 미리 [YY = xx는 여기 전에 기록, 합계 [XX] + = 합 [YY] 샘플이 해제 될 수 있지만, WA
 (41)가                  {
 42된다                      = 프리 [XX] YY,
 43은                      SUM [YY] + = SUM [XX]
 (44)이다                  }
 45              }
 46이다          }
 47          의 printf ( " % D의 \의 N- " , SUM [find_pre ( 0 )]);
 (48)      }
 (49)       0 ,
 50 }

 

추천

출처www.cnblogs.com/0xiaoyu/p/11375196.html