标签:hdoj3635 dragon balls 并查集 hdoj
2 3 3 T 1 2 T 3 2 Q 2 3 4 T 1 2 Q 1 T 1 3 Q 1
Case 1: 2 3 0 Case 2: 2 2 1 3 3 2主要是并查集,对并查集的理解,然后加点对移动次数的记录,只需每次加上自己父节点的移动个数即可!即:移动次数是把自己的加上父亲结点的就是移动总数了具体看代码:#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int MAXN=10010; int F[MAXN]; int num[MAXN]; int cnm[MAXN]; int n; void init() { for(int i=1;i<=n;i++) { F[i]=i;//父节点 num[i]=1;// 记录点数 cnm[i]=0;//移动次数 } } int find(int x) { int t; if(F[x]==x) return x; t=F[x]; F[x]=find(F[x]); cnm[x]+=cnm[t]; return F[x]; } void bing(int a,int b) { int t1=find(a); int t2=find(b); if(t1!=t2) { F[t1]=t2; num[t2]+=num[t1];//点数加 cnm[t1]=1;//将移动的点加入计算 } } int main() { int m; int T; char str[10]; int a,b; int iCase=0; scanf("%d",&T); while(T--) { iCase++; scanf("%d%d",&n,&m); init(); printf("Case %d:\n",iCase); while(m--) { scanf("%s",&str); if(str[0]=='T') { scanf("%d%d",&a,&b); bing(a,b); } else { scanf("%d",&a); int t=find(a); printf("%d %d %d\n",t,num[t],cnm[a]); } } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:hdoj3635 dragon balls 并查集 hdoj
原文地址:http://blog.csdn.net/zhangxiaoxiang123/article/details/47751921