hdu3635
2015-09-25 20:53
267 查看
并查集,记录该记录的,并且在适时的时候修改该修改的,就可以了。
2015.10.5:
hahahah
2015.10.5:
hahahah
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; #define N 10010 struct node{ int cou; int fa; int sum; }; node ball ; int root(int x){ if(ball[x].fa==x){ return x; } else{ int rx=root(ball[x].fa); if(ball[x].fa!=rx){//这里要有这个判断,但是根据题意,因为根节点的sum一定是0,所以不加也行 ball[x].sum+=ball[ball[x].fa].sum; } ball[x].fa=rx; return rx; } } int main(){ int t; int n,m; char ch[10]; int a,b; scanf("%d",&t); for(int cas=1;cas<=t;cas++){ printf("Case %d:\n",cas); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ ball[i].fa=i; ball[i].sum=0; ball[i].cou=1; } for(int i=0;i<m;i++){ scanf("%s",ch); if(ch[0]=='T'){ scanf("%d%d",&a,&b); int ra=root(a); int rb=root(b); if(ra==rb){//把rb写成了ra continue; } else{ ball[ra].fa=rb; ball[rb].cou+=ball[ra].cou; ball[ra].sum++;//这句没写,导致输出的3个数中最后一个永远是0,因为忘记了val和sum的含义,可能把这道题归为权重并查集,也是因为每个点都有一个独立的移动次数需要记录吧 //printf("%dha\n",ball[2].cou); } } else if(ch[0]=='Q'){ scanf("%d",&a); int ra=root(a); //printf("%d %d\n",a,ra); printf("%d %d %d\n",ra,ball[ra].cou,ball[a].sum); } } } return 0; }
相关文章推荐
- 我要上蓝翔
- [linux]windows通过VNC连接到ubuntu后输入没有显示--切换输入法
- 字符串反转
- 字节对齐&&sizeof
- test7.16
- Python实现读写文件
- Xcode断点 中断不正常 每次断点都进入汇编
- android 图片的加载保存 与 二级缓存
- C++读取csv文件并以map进行存储
- Metronic 使用到的开源插件汇总
- Asp.Net获取IP的方法
- poj 1734 Sightseeing trip判断最短长度的环
- Github入门
- 【Xcode7 使用NSURLSession发送HTTP请求出错 】
- UVA - 1587 Box
- Java 反射机制
- 问题解决——MFC Ribbon 添加图标
- 小技巧----随机背景颜色
- jQuery HTML之捕获、设置、元素添加、元素删除
- 链表