トピックリンクhttp://codeforces.com/contest/1249/problem/B2 。セットの数に分け互いに素セットのアイデアは、コレクションの各サイズは、ラウンドを必要な日数です。
マップ[i]のデータを格納します。
フラグに[i]はi番目にアクセスするかどうかを示します。
MM [i]がセットのサイズに対応するi番目のセットを記録し、インデックスiは、値の対応するセットのi番目の根です。
直接現在のコレクションのルートに、各ノードの中継を更新するという考えに再帰的な方法をGETPARENT。
訪問アクセスのないセットので、従って、分析時間の複雑さは、精度がO(CN)であり、Cは定数です。mmはそれ以外の問題があるでしょう、それぞれの使用後に清掃することに留意する必要があります。
1の#include <ビット/ STDC ++ H> 2 3 / * 4 *集查并 5 * / 6 7 使って 名前空間STDを、 8 9 静的 のconst INT MAX = 200005 。 10 11 INT マップ[MAX]。 12 ブールフラグ[MAX]。 13地図< INT、INT > MM。 14 15 INTのgetParent(INT X){ 16 であれば(!フラグ[X]){ 17 フラグ[X] =真; 18 地図[X] = のgetParent(マップ[X])。 19 } 20 リターンマップ[X]。 21 } 22 23 INT メイン(){ 24 のint Q。 25 のscanf(" %dの"、&Q)。 26 一方(q-- ){ 27 INT N。 28 のscanf(" %d個"、&N) 29 のために(int型 i = 1 ; iが<= N iが++ ){ 30 フラグ[I] = 偽。 31 } 32 33 // 構築物はセット 34 のint TMPを、 35 のために(int型 i = 1 ; iが<= N; iが++ ){ 36 のscanf(" %dの"、&マップ[I])。 37 } 38 39 // 解決 40 のために(int型 i = 1 ; iが<= N; iが++ ){ 41 のint親= のgetParent(I)。 42 mmの[親] ++; 43 } 44 45 のために(int型 i = 1 ; iがn = <; iは++ ){ 46 であれば(I == 1 ){ 47 のprintf(" %dの" 、MM [マップ[I])。 48 } 49 他{ 50 のprintf(" %dの" 、MM [マップ[I])。 51 } 52 } 53 のprintf(" の\ n " ); 54 mm.clear()。 55 } 56 リターン 0 。 57 }