POJ 1611 ---容疑者(互いに素なセット)

重症急性呼吸器症候群(SARS)、原因不明の非定型肺炎は、他者への送信を最小限に抑えるために半ば2003年3月に世界的な脅威として認識された、最善の戦略は、他の人から容疑者を分離することです。 
拡散はない-あなたの酔い大学(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の場合は、入力の終了を示し、そして処理する必要はありません。

出力

各場合について、出力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 }

 

おすすめ

転載: www.cnblogs.com/0xiaoyu/p/11375196.html