HDU 3635 带权并查集
来源:互联网 发布:鲁迅文学院网络作家班 编辑:程序博客网 时间:2024/06/04 18:12
/*分析注意几点:1,龙珠不可能 再次回到他最初呆的城市2,压缩路径,转移的次数为 **原始 + 前一个父亲节点的转移次数 ** */#include<iostream>#include<algorithm>#include<cstdio>#include<string>using namespace std;#define manx 10009int pre[manx],ans[manx],sum[manx];int root(int x){ if(pre[x]==x) return x; int temp = pre[x]; pre[x] = root(pre[x]); ans[x] += ans[temp]; return pre[x]; }int main(){ int t; scanf("%d",&t); for(int ca=1;ca<=t;ca++){ int n,q; scanf("%d%d",&n,&q); printf("Case %d:\n",ca); for(int i=0;i<=n;i++){ pre[i]=i; ans[i]=0; sum[i]=1; } char a[2]; int b,c; for(int i=1;i<=q;i++){ scanf("%s",a); if(a[0]=='T'){ scanf("%d%d",&b,&c); b = root(b); c = root(c); if(b!=c){ pre[b] = c; sum[c] += sum[b];//城市里龙珠的总数 ans[b]++; } } if(a[0]=='Q'){ scanf("%d",&b);//某个龙珠 int P = root(b); printf("%d %d %d\n",P,sum[P],ans[b]); } } }}