2017-01-22 10 views
0

たとえば、A = {1,2,3}とB = {6,7,8}の2つのセットをマージすると、1,8を両方のセットの代表とし、両方のセットをマージすると 結果セットの代表は何ですか?私たちの選択に基づいて選ぶことができますか? はUnion-findデータ構造でどの要素を代表するかを選択するにはどうすればよいですか?

#include<iostream> 
#define MAX 10001 
int rank[MAX];int parent[MAX]; 
void swap(int x,int y) 
{ 
int temp=0; 
temp=x; 
x=y; 
y=temp; 
} 
void make_set (int v) { 
parent[v] = v; 
rank[v] = 0; 
} 

int find_set (int v) { 
if (v == parent[v]) 
    return v; 
return parent[v] = find_set (parent[v]); 
} 

    void union_sets (int a, int b) { 
a = find_set (a); 
b = find_set (b); 
if (a != b) { 
    if (rank[a] < rank[b]) 
     swap (a, b); 
    parent[b] = a; 
    if (rank[a] == rank[b]) 
     ++rank[a]; 
    } 
     } 
    int main() 
    { 
    for(int i=1;i<=3;i++) 
    { 
    make_set(i); 
    } 
    std::cout<<find_set(1)<<"\n"; 
    union_sets(1,2); 
    union_sets(2,3); 
    std::cout<<find_set(2)<<"\n"; 
return 0; 
    } 

以下の私のコードでは、私は1として答えを取得していますか?別の代理人に変更したい場合はどうすればいいですか?

答えて

1

ランク配列を使用して2つのセットを結合するので、マージされたセットがランク付けされてマージされることに注意してください。
しかし、同じランクを持つ2つのセットが結合されている場合、結合はunion_sets関数のパラメータの順序に従って行われます。
あなたの質問に答えてください:1から変更したい場合(ターゲットセットが同じランクを持つ場合のみ可能です)、あなたがしなければならないことは、union_setを呼び出すときにパラメータを逆にすることです。

0

マージされたセットの代表は、最も高いランクを持つものになります。 詳細については、これは良いreadです。

関連する問題