并查集,直接套的模板,不过内存好大。。好像空间优化不好,先这样吧
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct FriendStruct
{
int id;
struct FriendStruct *parent;
int rank;
};
typedef struct FriendStruct *Friend;
static Friend make_set(int id)
{
Friend stu = malloc(sizeof(struct FriendStruct));
stu->parent = stu;
stu->id = id;
stu->rank = 1;
return stu;
}
static Friend find_set(Friend stu)
{
if (stu->parent != stu)
stu->parent = find_set(stu->parent);
return stu->parent;
}
static void link(Friend s1, Friend s2)
{
if (s1->rank > s2->rank)
{
s2->parent = s1;
s1->rank += s2->rank;
}
else
{
s1->parent = s2;
s2->rank += s1->rank;
}
}
static void union_set(Friend s1, Friend s2)
{
link(find_set(s1), find_set(s2));
}
int main()
{
int n, m, count = 0;
Friend *array = malloc(100000 * sizeof(Friend));
while (scanf("%d %d", &n, &m) != EOF)
{
memset(array, 0, 100000 * sizeof(Friend));
getchar();
if (count++)
putchar('\n');
printf("Case %d:\n", count);
int i, a, b;
char mq;
for (i = 0; i < m; i++)
{
mq = getchar();
if (mq == 'M')
{
scanf("%d %d", &a, &b);
getchar();
if (array[a - 1] == NULL)
array[a - 1] = make_set(a);
if (array[b - 1] == NULL)
array[b - 1] = make_set(b);
if (find_set(array[a - 1]) != find_set(array[b - 1]))
union_set(array[a - 1], array[b - 1]);
}
else
{
scanf("%d", &a);
getchar();
if (array[a - 1] == NULL)
puts("1");
else
printf("%d\n", find_set(array[a - 1])->rank);
}
}
}
free(array);
return 0;
}