hdoj2818
来源:互联网 发布:linux培训班 编辑:程序博客网 时间:2024/06/10 04:12
题目大意:
john 正在玩积木,有N个积木编号为1、、、N,分成N堆,每堆只包含一个积木,然后做P次操作,操作分为2种,
M X Y:把包含X的一堆放到包含Y的一堆上,如果XY同在一堆上,不做处理
C X:计算出X积木下边有多少个积木
每次遇到C操作,输出数量
解题思路:
并查集问题
代码如下:
#include<stdio.h>int r[30002],h[30002],l[30002];int root(int block){ int tem; if(h[block]==0) return block; tem=root(r[block]); h[block]=h[block]+h[r[block]]; r[block]=tem; return tem;}int main(void){ int i,x,P,y; char ch; scanf("%d",&P); for(i=0;i<=30000;i++) { r[i]=i; h[i]=0; l[i]=1; } while(P--) { getchar(); scanf("%c",&ch); if(ch=='M') { scanf("%d%d",&x,&y); if(root(x)==root(y)) continue; if(x!=r[x]) { r[r[x]]=r[y]; h[r[x]]=l[r[y]]; l[r[y]]+=l[r[x]]; h[x]=h[x]+h[r[x]]; r[x]=r[y]; } else { h[x]=l[r[y]]; r[x]=r[y]; l[r[y]]+=l[x]; } } else { scanf("%d",&x); root(x); printf("%d\n",h[x]); } } return 0;}
0 0