トピックへのリンク:http://cogs.pro:8081/cogs/problem/problem.php?pid=pySmxSVgP
[問題の説明 ]
たぶん、あなたは知っていない、あなたの友人の一人はあなたの親戚です。彼はいとこの姪の息子の祖父あなたの曾祖父の孫である可能性があります。あなたが得ることができるならば二人が親族であるかどうかを判断するための完全な家系図は可能なはずですが、二人は彼らの共通の祖先いくつかの世代から分離した場合、系図が非常に大きくなるようなので、何でも本当のテストヒト以外の親族。この場合には、最高のヘルパーコンピュータ。
問題を簡単にするために、あなたはXuebinの親戚やグラント、グラントと緊張親戚として、親族に関するいくつかの情報を取得するというように、この情報から、あなたはxuebinとテンション親戚を起動することができます。最速の答えの親族についての私たちの質問のために、プログラムを作成してください。
問題を簡単にするために、あなたはXuebinの親戚やグラント、グラントと緊張親戚として、親族に関するいくつかの情報を取得するというように、この情報から、あなたはxuebinとテンション親戚を起動することができます。最速の答えの親族についての私たちの質問のために、プログラムを作成してください。
[入力形式]
入力は2つの部分からなる:
第1部分N、Mが開始されます。N人(1 <N <20000)に関連した問題の数です。これらの人々は、1,2,3番号が付けられている...、N. 線M(1 <M <1000000)の下に、各ラインは、二つの数字がaiを有するBI、AIとBIは、既知の親族を表します。
2番目のセクションではQ.で始まります 以下のQ行がQ(1 <Q <1000000)を求めている、すべての行動CI、DI、DIとCIは、親戚かどうかを尋ねる表します。
第1部分N、Mが開始されます。N人(1 <N <20000)に関連した問題の数です。これらの人々は、1,2,3番号が付けられている...、N. 線M(1 <M <1000000)の下に、各ラインは、二つの数字がaiを有するBI、AIとBIは、既知の親族を表します。
2番目のセクションではQ.で始まります 以下のQ行がQ(1 <Q <1000000)を求めている、すべての行動CI、DI、DIとCIは、親戚かどうかを尋ねる表します。
[出力形式]
出力ライン数がありますが、
各照会CI、ジ、ジ、及びもし親族のためにCI、出力はい、そうでなければ出力号
[O]サンプル
入力ファイル
10 7
2 4
5 7
1 3
8 9
1 2 3
5 6
2 3
3
3 4
7 10
8 9
2 4
5 7
1 3
8 9
1 2 3
5 6
2 3
3
3 4
7 10
8 9
出力ファイル
はい
なし
はい
なし
はい
互いに素セット:互いに素-セットは、効率的な分類アルゴリズムで重要なタイトル分類手段がある場合に、ばらばらのセットを使用することを検討して、同じ要素の特徴を抽出し、分類を見つけます。
最初のステップ:各ユニットのセットとして。
ステップ2:2つの要素を検索し、それが1セットにまとめ異なる特性の同じセットを、持っている場合。
第三段階:オンデマンドでは、コレクション内の対応する要素を検索します。
最適化:パス圧縮
発見の根と根は左と右の息子の息子の息子の息子は、根にある2人の孫をリンクする時の複雑さが増加を見つけるために、層によって鎖状構造、層の形成を妨げる可能性、コレクションです。
コード:
1 の#define _CRT_SECURE_NO_WARNINGS 2の#include <iostreamの> 3の#include <cstdioを> 4 の#define MAXN 1000100 5 使って 名前空間STDを、 6 7 整数 N、M、予め[MAXN] = { 0 }、Q。 8 int型AI、BI; 9 10 INTの検索(INT X) 11 { 12 であれば(X == 事前[X]) 13 リターンX。 14 リターンは、予め[X] =([X] PRE)を見つけます。// 路径压缩 15 } 16 17 空隙連合(int型のx、int型のY) 18 { 19 INT XPRE = (X)を求めます。 20 INT YPRE = (y)を見つけます。 21 であれば(XPRE =!YPRE) 22 プレ[Y] = XPRE。 23 } 24 25 ボイドpreWork() 26 { 27 のための(int型 i = 1 ; iが= Nを<; Iは++ ) 28 プレ[I] = I。 29 } 30 31 INTmain()の 32 { 33 freopenは(" relations.in "、" R " 、STDIN)。 34 freopenは(" relations.out "、" W " 、STDOUT)。 35 のscanf(" %d個の%のD "、&N、&M)。 36 preWork()。 37 38 ながら(M-- ) 39 { 40 のscanf(" %d個の%のD "、&AI&BI)。 42 } 43 のscanf(" %dの"、&Q)。 44 一方(Q-- ) 45 { 46 のscanf(" %d個の%のD "、&AI&BI)。 47 INT APRE = 検索(AI)。 48 int型 BPRE = のfind(BI)。 49 もし(!APRE = BPRE) 50 のprintf(" ノー\ nを" ); 51 他の 52 のprintf(" はい\ n " ); 53 } 54 リターン 0 。 55 }