您的位置:首页 > 其它

hdu3635

2015-09-25 20:53 267 查看
并查集,记录该记录的,并且在适时的时候修改该修改的,就可以了。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: