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
原创粉丝点击