题目描述:
贝西正在玩游戏,方块编号为1~N(1<= N <= 1000), 开始时每个方块都相当于一个栈。贝西执行一系列操作, 操作类型有两种: MXY,将包含X的栈整体移动到包含Y的栈顶部; C X,查询X方块下的方块数量。 请统计贝西每个查询操作的结果。
输入: 第一行为单个整数N, 表示方块的数量。 第2 行开始每行进行一个操作。
输入样例:
输入样例:
6
M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
输出样例:
1
0
2
算法实现:
#include <stdio.h>
void init(int *fa,int *d, int *cnt, int n)
{
int i;
for(i = 1; i<=n; i++)
{
fa[i] = i;
d[i] = 0;
cnt[i] = 1;
}
}
int Find(int *fa, int *d, int x)
{
int fx = fa[x];
if(x != fa[x])
{
fa[x] = Find(fa,d, fa[x]);
d[x] += d[fx];
}
return fa[x];
}
void Union(int *fa, int *d, int *cnt, int x, int y)
{
int a = Find(fa, d, x);
int b = Find(fa, d, y);
fa[a] = b;
d[a] = cnt[b];
cnt[b] += cnt[a];
cnt[a] = 0;
}
int main()
{
int fa[1000] = {0};
int d[1000] = {0};
int cnt[1000] = {0};
int N, X,Y;
char P;
while(scanf("%d", &N) != EOF)
{
if(N == 0) return 0;
if(getchar()=='\n')
{
// 初始化
init(fa, d, cnt,N);
while(scanf("%c ", &P) != EOF)
{
if('M'==P)
{
scanf("%d %d", &X, &Y);
Union(fa, d, cnt, X, Y);
fflush(stdin);
}
else if('C' == P)
{
scanf("%d", &X);
Find(fa, d, X);
printf("%d\n", d[X]);
fflush(stdin);
}
else
{
printf("input M X Y or C X !\n");
}
}
}
}
return 0;
}