質問の意味:
nはm番目の学生のグループに属する、学生は複数のグループに属することができます。学生疑われる病気は、彼が属するグループ全体が病気を疑われています。0知られている疑いがある病気は、各グループは、学生憲法、疑われる病気を求めている学生の総数を持っています
ソリューション:
古典的なトピックと検索セット、個人のコレクションのルートとして各インデックスの現在のレコードの[]配列NUM番号NUM番号0に対応するルートノードの最終的な出力値を見つけ、0番は、学生のグループであります番号。
コード:
書式#include <iostreamの> 書式#include <stdio.hに> する#include <math.h>の 使用して 名前空間はstd; typedefの長い 長いLL。 const int型 MAXN = 5E5 + 5 。 INT [MAXN] F。 INTのN、M。 int型NUM [MAXN]。 INT [MAXN]。 INT検索(int型X) { 戻り X == F [x]はx:F [X] = 検索(F [X])。 } ボイドは、(参加int型のx、int型のY) { int型 FXを= 探す(X)。 int型FY = 検索(Y)。 もし(!FX = FY) { F [FX] = FY。 NUM [FY] + = NUM [FX]。 } } int型のmain() { ながら(scanf関数(" %d個の%のD "、&N、&M)&&(N || M))は { ため(int型 i = 0 ; iがn <; iは++)= [I] F I 、NUM [I] = 1 。 一方、(M-- ) { int型K。 scanf関数(" %のD "、&K)。 以下のための(INT I = 1 ;()は、i ++はscanf関数を、私は= Kを< " %のD "、および[I])。 以下のために(int型 i = 1 ; iはkは<; I ++の)参加([I]、[I + 1 ])。 } int型 K =探す(0 )。 printf(" %d個の\ n " 、NUM [K])。 } 戻り 0 。 }