//不容易啊,终于自己a了一道这种类型的题

//

#include<stdio.h>

#include<iostream>

using namespace std;

const int N=30010;

struct node {

int front,last,count;

}pre[N];

int find(int x) {//指向队尾

if(x!=pre[x].last) {

         int h=pre[x].last;

pre[x].last=find(pre[x].last);

pre[x].count=pre[h].count+pre[x].count;//路径压缩

}

return pre[x].last;

}

int find1(int x) {//求队首相当于一个元素指向两个方向,这个指向队首

if(x!=pre[x].front)

pre[x].front=find1(pre[x].front);

return pre[x].front;

}

int main() {

int n,i,a,b,f1,f2;

char  s[2];

while(scanf("%d",&n)!=EOF) {

for(i=1;i<=N;i++) {

pre[i].last=i;

pre[i].front=i;

pre[i].count=0;

}

while(n--) {

scanf("%s",s);

if(s[0]=='M') {

scanf("%d%d",&a,&b);

 f1=find(a);//a集合的队尾

 f2=find(b);

 if(f1==f2)//如果有相同的根节点不用再加了

 continue;

 f2=find1(b);//求b集合的队首

 pre[f1].last=f2;//a集合队尾指向b集合队首

 pre[f1].count=1;//权值为1

         pre[f2].front=f1;//b集合的队首指向a集合的队尾

}

else  {

scanf("%d",&a);

        find(a);

printf("%d\n",pre[a].count);

}

}

}

return 0;

}

//我在网上看了个代码我承认我的方法没有人家的好我又写了一下

#include<stdio.h>

#include<iostream>

using namespace std;

const int N=30010;

int  pre[N],dis[N],sondis[N];

int find(int x) {

 if(x!=pre[x]) {

  int h=pre[x];

  pre[x]=find(pre[x]);

  dis[x]+=dis[h];

 }return pre[x];

}

void unions(int x,int y) {

 int f1=find(x);

 int f2=find(y);

 if(f1==f2)

  return ;

 pre[f1]=f2;

 dis[f1]=sondis[f2]+1;

 sondis[f2]=sondis[f2]+sondis[f1]+1;

}

int main() {

 int n,m,i,j,k,a,b;

 char s[2];

 while(scanf("%d",&n)!=EOF) {

  for(i=1;i<=N;i++) {

   pre[i]=i;

   dis[i]=0;

   sondis[i]=0;

  }

  while(n--) {

   scanf("%s",s);

   if(s[0]=='M') {

    scanf("%d%d",&a,&b);

    unions(a,b);

   }

   else {

    scanf("%d",&a);

    find(a);

    printf("%d\n",dis[a]);

   }

  }

 }

 return 0;

}

最新文章

  1. 使用jenkins配置.net mvc网站进行持续集成三
  2. GridView 动态添加绑定列和模板列
  3. 批量删除 svn文件
  4. java 常见dos命令
  5. MVC中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
  6. SET UPDATE TASK LOCAL
  7. 五个有用的jquery小技巧
  8. SqlServer维护计划
  9. 【Linux】vi编辑器命令
  10. makefile高级用法--使用函数
  11. 虚拟化之KVM的安装续篇
  12. python 杨辉三角 算法实现
  13. IScroll那些事——内容不足时下拉刷新
  14. StringUtils工具类常用方法汇总1(判空、转换、移除、替换、反转)
  15. MYSQL———正则表达式查询!
  16. 搭建SpringBoot+dubbo+zookeeper+maven框架(一)
  17. Dictionary 对象
  18. mqtt介绍
  19. JS三种简单排序算法
  20. android 学习过程中登陆失效的个人理解

热门文章

  1. 应用交付、负载均衡(Load balancing)、高可用、F5
  2. Hibernate3中重复引用hbm文件错误信息记录
  3. 【转载】WebConfigurationManager和ConfigurationManager
  4. Hackonacci Matrix Rotations 观察题 ,更新了我的模板
  5. Oracle事务控制语言
  6. Webform 内置对象 Session对象、Application全局对象,ViewState
  7. iOS 中集成百度echarts3.0
  8. time模块、datetime模块讲解
  9. java.lang.String 字符串操作
  10. iOS Programming UIStoryboard 故事板