#include<stdio.h> #include<string.h> int id[10010],trans[10001],Size[10001]; int idq,idp,n,m; int ans[10001][3]; char kind; int Quickfind(int a) { while(id[a]!=id[id[a]]){ trans[a]+=trans[id[a]]; id[a]=id[id[a]]; } return id[a]; } void Quickution(int idq, int idp) { id[idq]=idp; Size[idp]+=Size[idq]; trans[idq]+=1; } int main() { int i,j; int a,b; int ball; int num; scanf("%d",&num); int sum=0; while(num--){ int N=0; scanf("%d %d",&n,&m); memset(trans,0,sizeof(trans)); for(i=1;i<=n;i++){ Size[i]=1; } for(i=1;i<=n;i++){ id[i]=i; } for(i=0;i<m;i++){ getchar(); scanf("%c",&kind); if(kind=='T'){ scanf("%d %d",&a,&b); idq=Quickfind(a); idp=Quickfind(b); Quickution(idq,idp); } else { scanf("%d",&ball); idq=Quickfind(ball); ans[N][0]=id[idq]; ans[N][1]=Size[idq]; int b=Quickfind(ball); ans[N][2]=trans[ball]; N++; } } sum++; printf("Case %d:\n",sum); for(i=0;i<N;i++){ printf("%d %d %d\n",ans[i][0],ans[i][1],ans[i][2]); } } return 0; } 并查集算法的应用: 应为要记录转移次数,使得压缩结点的方法和原先的不一样了,原来是 int Quickfind(int n){ while(n!=id[n]){ id[n]=id[id[n]];//压缩路径 n=id[n]; } return n; } 现在是: int Quickfind(int n){ while(id[n]!=id[id[n]]){//如果当前节点的前一节点不是根节点的化,当前节点的转移次数就要更新,及加上前一节点的转移次数 trans[n]+=trans[id[n]]; id[n]=id[id[n]];//压缩路径 } return id[n]; }
07-21
07-21
07-21
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交