hdu 3635

来源:互联网 发布:js修改div样式 编辑:程序博客网 时间:2024/05/16 13:39

题目

wa了n次,最后网上搜代码。

要先进行移动的步数的更新,在路径压缩,否则就是wa

代码如下;

#include<iostream>#include<cstdio>using namespace std;#define maxn 10010int pre[maxn],num[maxn],times[maxn];inline int find(int x){    if(x==pre[x]) return x;    int t=pre[x];    pre[x]=find(pre[x]);    times[x]+=times[t];    return pre[x];}//先把移动的值记录下来,再进行路径的压缩inline void Union(int x,int y){    int fx=find(x);    int fy=find(y);    if(fx!=fy){        pre[fx]=fy;        num[fy]+=num[fx];        times[fx]=1;    }}inline int input(){    char c;    int ret=0;    c=getchar();    while(c<'0'||c>'9') c=getchar();    while(c>='0'&&c<='9') ret=ret*10+c-'0',c=getchar();    return ret;}int main(){    int T,i,n,m,ncase=1;    int a,b;    T=input();    while(T--){        printf("Case %d:\n",ncase++);        n=input();m=input();        for(i=1;i<=n;i++){            pre[i]=i;            times[i]=0;            num[i]=1;        }        while(m--){            char str[5];            scanf("%s",&str);            if(str[0]=='T'){                a=input();b=input();                Union(a,b);            }            else{                a=input();                int ans=find(a);                printf("%d %d %d\n",ans,num[ans],times[a]);            }        }    }    return 0;}


原创粉丝点击