zoj2833-Friendship

来源:互联网 发布:网络教学的排行 编辑:程序博客网 时间:2024/09/21 09:02
#include<stdio.h>int father[100001];int fine(int x)//压缩,只用压缩时间320{int r=x,j;while(father[r]>0)r=father[r];//r是根while(r!=x){ j=father[x]; father[x]=r; x=j;}return r;}void weightmerge(int x,int y)//只用折叠时间为280//折叠压缩一起用260{int temp;int ix,iy; ix=fine(x);iy=fine(y);temp=father[ix]+father[iy];if(ix!=iy)if(father[ix]>father[iy])//ix的结点少,以结点多的为父节点{father[iy]=temp;father[ix]=iy;//iy为父指针}else{father[ix]=temp;father[iy]=ix;//ix为父指针}}int main(){int N,M,icase=1;char c;bool flag=false;while(scanf("%d%d",&N,&M)!=EOF){if(flag)printf("\n");flag=false;for(int i=1;i<=N;i++){father[i]=-1;}while(M--){int re1,re2,q;scanf("%*c");scanf("%c",&c);if(c=='M'){scanf("%d%d",&re1,&re2);weightmerge(re1,re2);}else{if(!flag){printf("Case %d:\n",icase++);flag=true;}scanf("%d",&q);printf("%d",-father[fine(q)]);if(M!=1)printf("\n");}}}return 0;}