- 有点写复杂了,在find函数里应该返回int而不是data类型比较好
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct data{
int parent;
int priority;
}data;
void Init(data a[], int n)
{
for(int i = 0; i <n;i++)
{
a[i].parent = i;
a[i].priority = 0;
}
}
data find(data a[], int x) {
if (a[x].parent!= x) {
data root = find(a, a[x].parent);
a[x].parent = root.parent;
return root;
}
return a[x];
}
void Merge(data a[], int x, int y) {
data root_a = find(a, x);
data root_b = find(a, y);
if (root_a.parent!= root_b.parent) {
if (root_a.priority < root_b.priority) {
{
a[root_a.parent].parent = a[root_b.parent].parent;
}
} else if (root_a.priority > root_b.priority) {
a[root_b.parent].parent = a[root_a.parent].parent;
} else {
if (root_a.parent < root_b.parent) {
a[root_b.parent].parent = a[root_a.parent].parent;
} else {
a[root_a.parent].parent = a[root_b.parent].parent;
}
a[root_a.parent].priority++;
}
}
}
data* a;
int main()
{
printf("输入格式为:先输入有一共有几个,再每一行输入两个数表示在同一类,从零开始:\n");
int n;
scanf("%d", &n);
a = (data*)malloc(sizeof(data)*(n+1));
Init(a, n);
int x,y;
while(scanf("%d%d", &x, &y) != EOF)
{
Merge(a, x, y);
}
printf("输出有几个集合:\n");
int cnt = 0;
for(int i = 0; i < n; i++)
{
if(a[i].parent == i)
cnt++;
}
printf("%d", cnt);
free(a);
return 0;
}