//===================================== // KinderRiven POJ 1899 //===================================== #include<cstdio> #include<cstring> using namespace std; const int maxn = 33333; const int INF = 30000; int fa[maxn]; //父亲结点的编号 int ret[maxn]; //压在i下面有几个木块 int size[maxn]; //以结点i为底的栈中元素的个数,如果i不是根,那么size[i] = 0; void init(){ for(int i = 1; i <= INF; i++){ fa[i] = i; ret[i] = 0; size[i] = 1;} } int find_father(int u){ if(fa[u] != u){ int temp = fa[u]; fa[u] = find_father(fa[u]); if(size[u]){ //size[i]不为0说明该元素为栈底的元素 ret[u] += size[temp]; size[temp] += size[u]; size[u] = 0; } else //否则的话这个元素就是一个普通的元素 ret[u] += ret[temp]; } return fa[u]; } void union_set(int p,int q){ int fp = find_father(p); int fq = find_father(q); fa[fp] = fq; find_father(p); find_father(q); return; } int main(){ int n; init(); scanf("%d",&n); while(n--){ char op[10]; scanf("%s",op); if(op[0] == 'M'){ int x,y; scanf("%d%d",&x,&y); union_set(x,y); } else{ int x; scanf("%d",&x); find_father(x); printf("%d\n",ret[x]); } } return 0; }
时间: 2024-10-24 07:23:05