アルゴリズムの解析と設計互いに素セット

互いに素セットの研究ノート

互いに素セットは、(設定組合-見つける。)抽象データ型です。これは、すなわち、動的に維持し、要素の集合間の複雑な関係を処理し、「設定」の関係を扱う
(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リリース!

おすすめ

転載: www.cnblogs.com/ZCWang/p/11656660.html