重症急性呼吸器症候群(SARS)、原因不明の非定型肺炎は、他者への送信を最小限に抑えるために半ば2003年3月に世界的な脅威として認識された、最善の戦略は、他の人から容疑者を分離することです。
拡散はない-あなたの酔い大学(NSYSU)では、多くの学生のグループがあります。同じグループの学生が頻繁にお互いに相互通信し、学生はいくつかのグループに参加することができます。SARSの可能性のある送信を防ぐために、NSYSUは、すべての学生グループのメンバーリストを収集し、その標準作業手順(SOP)に以下のルールを作ります。
グループのメンバーが容疑者になると、グループ内のすべてのメンバーは、容疑者です。
しかし、彼らは学生が容疑者として認識されている場合、すべての容疑者を特定することは容易ではないことがわかります。あなたの仕事は、すべての容疑者を発見するプログラムを書くことです。
拡散はない-あなたの酔い大学(NSYSU)では、多くの学生のグループがあります。同じグループの学生が頻繁にお互いに相互通信し、学生はいくつかのグループに参加することができます。SARSの可能性のある送信を防ぐために、NSYSUは、すべての学生グループのメンバーリストを収集し、その標準作業手順(SOP)に以下のルールを作ります。
グループのメンバーが容疑者になると、グループ内のすべてのメンバーは、容疑者です。
しかし、彼らは学生が容疑者として認識されている場合、すべての容疑者を特定することは容易ではないことがわかります。あなたの仕事は、すべての容疑者を発見するプログラムを書くことです。
入力
入力ファイルは、いくつかの例が含まれています。各テストケースは、nは、学生の数であり、mはグループの数であるライン内の2つの整数n及びmで始まります。あなたは0 <N <= 30000及び0 <= M <= 500のすべての学生が0とn-1との間の一意の整数により番号付けされ、そして最初生徒0は、すべての場合において容疑者として認識されていること。想定できます このラインは、グループのM個のメンバーリスト、グループごとに1つの行が続きます。各ラインは、グループ内のメンバーの数を表す単独で整数kから始まります。メンバーの数に続いて、このグループの学生を代表するk個の整数があります。行のすべての整数は、少なくとも1つのスペースで区切られます。
n = 0であり、m = 0の場合は、入力の終了を示し、そして処理する必要はありません。
n = 0であり、m = 0の場合は、入力の終了を示し、そして処理する必要はありません。
出力
各場合について、出力1つのラインの容疑者の数。
サンプル入力
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を有していてもよく、全グループがあると同時に、病気であってもよいし、多くの人々が複数のグループ、小グループでの病気かもしれどのように尋ねました。
アイデア:
ディスジョイントセット、および最終コレクション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 であれば(PRE [X] == x)をリターンX。 20 他 リターン予め[X] = find_pre(PRE [X])。 21 } 22 23 のint main()の 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; iが++ ) 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 }