互いに素セットの研究ノート
互いに素セットは、(設定組合-見つける。)抽象データ型です。これは、すなわち、動的に維持し、要素の集合間の複雑な関係を処理し、「設定」の関係を扱う
(a、b)は、「マージ」速い必要とするとき場合、所与の疾患の二つの要素コレクションをそれぞれAとBと、繰り返し要素のセットが配置されている「見つける」との間に必要。「そして」、「チェック」と、このから単語を「設定」。
どこ連結要素のコレクションは、コレクションの要素を見つけます
アレイ達成
互いに素-集合演算のサポート
(x)はMAKE:新しいコレクションを作成するには、その唯一のメンバー(同時にで表現するためである)xです。各セットが分離されているので、X他のセット内の要求がありました。
UNIONN(X、Y):XおよびY(例えばSxのとSyの)との動的セットは新しいセットにマージ、この操作の前に二組が分離されているものとします。結果のセットはSx∪Syのメンバーの代表です。一般的に、様々な実装において一般新しいコレクションの代表として、SXまたはSyのを表現します。その後、新しいセットではなく、元のSxとSyののS。
(x)を求める:Xを含む代表的なセットへのポインタを返します。
求めます
int find(int x) { //用非递归的实现
while (father[x] != x) x = father[x];
return x;
}
int find(int x){//用递归的实现
if (father[x] != x){
return find(father[x]);
} else{
return x;
}
}
合併
void unionn(int r1,int r2){
father[r2] = r1;
}
int main(){
cin >> n >> m;
for (i = 1; i <= n; i++)
father[i] = i; //建立新的集合,其仅有的成员是i
for (i = 1; i <= m; i++) {
scanf("%d%d",&x,&y);
int r1 = find(x);
int r2 = find(y);
if (r1 != r2){
unionn(r1,r2);
}
}
cin >> q;
for (i = 1; i <= q; i++) {
scanf("%d%d",&x,&y);
if (find(x) == find(y)){
printf("Yes\n");
} else {
printf("No\n");
}
}
return 0;
}
ブログ記事複数のプラットフォームからこの記事OpenWriteリリース!