Description

Input
Output
Sample Input
2 3 3 T 1 2 T 3 2 Q 2 3 4 T 1 2 Q 1 T 1 3 Q 1
Sample Output
Case 1: 2 3 0 Case 2: 2 2 1 3 3 2有n个龙珠,在1到n个城市中,T a b 移动a所在城市的所有龙珠到b所在的城市,Q a 输出a所在的城市,城市的龙珠数量,a移动的次数,并查集问题,一个数组记录每个龙珠移动的次数,一个记录城市龙珠的数量,T a b 代表a移动的次数+1,并且所有指向a所在的城市的龙珠移动次数+1 , b所在的城市龙珠数量加a所在的城市
#include <cstdio>
#include <cstring>
int p[11000] , c[11000] , num[11000] ;
/*int f(int x)
{
int r , k , l , temp = 0 ;
r = x ;
while( r != p[r] )
{
r = p[r] ;
temp++ ;
}
k = x ;
while( k != r )
{
l = p[k] ;
c[k] += ( --temp ) ;
p[k] = r ;
k = l ;
}
return r ;
}*/
int f(int x)
{
if(x==p[x])
return x;
int t=p[x];
p[x] = f(p[x]);
c[x] += c[t];
return p[x];
}
void add(int u,int v)
{
u = f(u) ;
v = f(v) ;
if(u != v)
{
p[u] = v ;
num[v] += num[u] ;
num[u] = 0 ;
c[u]++ ;
}
}
int main()
{
int t , tt , i , n , m , a , b ;
char ch ;
scanf("%d", &t);
for(tt = 1 ; tt <= t ; tt++)
{
printf("Case %d:\n", tt);
scanf("%d %d", &n, &m);
for(i = 1 ; i <= n ; i++)
{
p[i] = i ;
num[i] = 1 ;
}
memset(c,0,sizeof(c));
while(m--)
{
scanf("%*c%c", &ch);
if( ch == 'T' )
{
scanf("%d %d", &a, &b);
add(a,b);
}
else
{
scanf("%d", &a);
int k = f(a) ;
printf("%d %d %d\n", k, num[k] , c[a] );
}
}
}
return 0;
}
测试赛F - Dragon Balls(并查集),布布扣,bubuko.com
原文:http://blog.csdn.net/winddreams/article/details/38300599