hdu3635

来源:互联网 发布:四大网络交流平台 编辑:程序博客网 时间:2024/06/02 06:31

并查集,记录该记录的,并且在适时的时候修改该修改的,就可以了。

2015.10.5:

hahahah

#include<stdio.h>#include<string.h>#include<iostream>using namespace std;#define N 10010struct node{    int cou;    int fa;    int sum;};node ball[N];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;}


0 0
原创粉丝点击