Corporative Network(带权并查集)

    这个题的题意是  当输入‘E'是查找操作,查找从后面这个数到他的父亲这边的值,‘I’代表把后面的数作为前面数的父亲

    然后他们两个的差值代表这两个边的权值

水水的题

#include <stdio.h>
#include <string.h>
int par[20005];
int rank1[20005];
int abs(int hh)
{
    return (hh>0)?hh:-hh;
}
void init()
{
    for(int i=0;i<20005;i++)
    {
    	par[i]=i;
    	rank1[i]=0;
    }
}
int  findset(int x)
{
    int root;
	if(x!=par[x])
	{
		root=findset(par[x]);
		rank1[x]+=rank1[par[x]];
		par[x]=root;
	}
	return par[x];
}

int main()
{
	int T;
	int k;
	int a,u,v;
	char s[10];
	while(scanf("%d",&T)==1)
	{
		while(T--)
		{
			scanf("%d",&k);
            init();
          while(scanf("%s",s)!=EOF)
          {
              if(s[0]=='O')
                break;
          	if(s[0]=='E')
          	{
          		scanf("%d",&a);
          		findset(a);
          		printf("%d\n",rank1[a]);
          	}
          	else
          	{
          		scanf("%d%d",&u,&v);
          		par[u]=v;
          		rank1[u]=abs(u-v)%1000;
          		//printf("%d %d\n",u,rank1[u]);
          	}
               // printf("%d    %d   %d   %d\n",rank1[1],rank1[2],rank1[3],rank1[4]);
          }

		}

	}

}

你可能感兴趣的:(Corporative Network(带权并查集))