トピック分析:
この問題Nは1〜1000の範囲である表題の互いに素なセットのデータ入力を知っていると題する予備ブラウザのテンプレートであり、Mは、接続関係の各レコードの構造を介して、0〜1000 ^ 2の範囲であり、P []配列各ノードのレコードと、k個のクエリのために、再メンテナンスP []配列、及び各差分を排除しなければならないノードが占有し直されることがあるたびに、ノードのリンク関係P []配列を維持し、最終的に数-2答えは(職業のセットは別のポイントである必要があり、N N-1セットがエッジに接続することができる必要)設定されています
1つの#include <iostreamの> 2 使用して 名前空間STDを、 3 4 構造体ノード{ 5 INT から。 6 int型へ。 7 } [ 1000005 ]。 8 int型 P [ 1005 ]。 9 int型N、M、K。 10 11 int型の検索(INT X){ 12 INT Y =のX。 13 一方、(P [X] =!X){ 14 、X = P [X]。 15 } 16 // パスコンプレッサケースは、Xルートである 。17 ながら(!P [Y] = {X) 18は、 INT T = Y; // ビットを予約する経路上の各Yノードに対して 19 のy P = [Y]; / / このケースでは、まだルート照会する上記ために 20である P [T] =のX; // yはP [Y]の値となっており、tはyおよびP [以前Y]の値が前に記録されています未満、及びそのパスが圧縮され、それがXと直接なる 21は } 22が リターンX; 23である } 24 25 ボイド連合(のINTの X、INT Y){ 26は int型 = FX 検索(X); 27 int型 FY =検索(Y) 28 IF(FXが=!FY){ 29 P [FX] = FY; 30 } 31である } 32 33である ボイドのinit(INT 占める){ 34である ため(INT I = 1 ; I <= N; I ++は) P [I] = I; 35 のために(int型私は= 1 ; I <= M、Iは++ ){ 36 // 念頭に維持互いに素なセット軸受1:1の関係に応じて占有都市は関与していない 37 IF([I] から!&& = A [I] .TO占拠!= 占拠){ 38は 連合(A [I]の。[I] .TO)。 39 } 40 } 41 } 42 43 空隙ラン(){ 44 INT ANS = 0 。 45 のためには、(int型 i = 1 ; iがn = <; iは++ ){ 46 であれば(P [I] == I){ 47の ANS ++ 。 48 } 49 } 50 のprintf(" %d個の\ n "、ANS - 2 )。 51 } 52 53 INTメイン(){ 54 ながら(scanf関数(" %D%D%D "、&N、&M、&K)!= EOF){ 55 のための(int型 I = 1 ; I <= M Iは++ ){ 56 のscanf(" % D%D 」。、&[I] から&、[I] .TO)。 57 } 58 intが占めます。 59 のために(int型 i = 1 ; iが= Kを<; Iは++ ){ 60 のscanf(" %dの"、&占めます)。 61 // たびに初期化互いに素なセット 62は (占拠)INIT; 63れる // 行番号は、各時刻における少なくとも添加することを得る 64 RUNを(); 65 } 66 } 67 リターン 0 ; 68 }