一个并查集,别人都是开了一个struct,然后利用递归计算转移
,我这个方法用时会多一点。略显笨,但直观。
#include<cstdio>
#include<cstring>
const int maxn = 10000 + 5;
int pre[maxn];
int num[maxn];
int croot(int x)
{
int cnt = 0;
while(x != pre[x])
{
cnt++;
x = pre[x];
}
return cnt;
}
int root(int x)
{
while(x != pre[x])
x = pre[x];
return x;
}
void merge_set(int x, int y)
{
int fx = root(x);
int fy = root(y);
//printf("%d %d %d\n", fx, fy, y);
if(fx != fy)
{
pre[fx] = fy;
num[fy] = num[fy] + num[fx];
}
}
int main()
{
int T;
scanf("%d", &T);
for(int kase = 1; kase <= T; kase++)
{
int n, q;
scanf("%d%d", &n, &q);
//printf("%d %d\n", n, q);
for(int i = 0; i <= n; i++)
{
pre[i] = i;
//printf("%d %d\n", i, pre[i]);
}
//printf("%d\n", pre[3]);
for(int i = 0; i <= n; i++)
num[i] = 1;
char cmd[10];
printf("Case %d:\n", kase);
while(q--)
{
scanf("%s", cmd);
if(cmd[0] == 'T')
{
int t1, t2;
scanf("%d%d", &t1, &t2);
merge_set(t1, t2);
}
if(cmd[0] == 'Q')
{
int temp;
scanf("%d", &temp);
printf("%d %d %d\n", root(temp), num[root(temp)], croot(temp));
}
}
}
return 0;
}
,我这个方法用时会多一点。略显笨,但直观。