/* 森表現による集合族のMERGEとFINDのプログラム例 */ #include #define N 7 /* 要素数 */ #define M 4 /* 最大集合数 */ struct set /* 構造体setの定義 */ { int size[M]; int root[M]; int parent[N]; }; /* 関数の宣言 */ void treemerge(int i, int k, struct set *S); int treefind(int j, struct set *S); main() /* 森表現による集合族のテストプログラム */ { struct set S; int i, j, k; FILE *file; file=fopen("mtreedata", "r"); for(i=0; isize[i] <= S->size[k]) {small=i; large=k;} else {small=k; large=i;} j=S->root[small]; /* 小さい集合jを大きい方へ併合 */ if(S->size[small] == 0) return; S->parent[j] = S->root[large]; /* 集合族データSの更新 */ S->size[large] = S->size[large]+S->size[small]; S->size[small] = 0; S->root[small] = -1; return; } int treefind(int j, struct set *S) /* jを要素とする集合iの出力と路の圧縮 */ { int i, k, temp; k=j; /* 集合iの発見 */ while(k>=0) k = S->parent[k]; i = -k-1; k=j; /* 路の圧縮 */ while(k>=0) { temp = S->parent[k]; if(temp>=0) S->parent[k] = S->root[i]; k=temp; } return(i); }