http://acm.hdu.edu.cn/showproblem.php?pid=3635
题意:
有n颗龙珠和n座城市,一开始第i颗龙珠就位于第i座城市,现在有2种操作,第一种操作是将x龙珠所在城市的所有龙珠移至y龙珠所在城市,第二种操作是计算x龙珠所在城市y,y城市龙珠个数,以及x龙珠移动的次数。
思路:
num[x]用来维护x城市所包含的龙珠个数,cnt[x]维护x龙珠所移动的次数。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #include<queue> 8 #include<cmath> 9 #include<map> 10 #include<set> 11 using namespace std; 12 typedef long long ll; 13 typedef pair<int,int> pll; 14 const int INF = 0x3f3f3f3f; 15 const int maxn = 10000+5; 16 17 int n, m; 18 int p[maxn], num[maxn], cnt[maxn]; 19 20 int finds(int x) 21 { 22 if(p[x]==x) return x; 23 int tmp=p[x]; 24 p[x]=finds(p[x]); 25 cnt[x]+=cnt[tmp]; 26 return p[x]; 27 } 28 29 int main() 30 { 31 //freopen("in.txt","r",stdin); 32 int T; 33 int kase = 0; 34 scanf("%d",&T); 35 while(T--) 36 { 37 printf("Case %d: ",++kase); 38 scanf("%d%d",&n,&m); 39 for(int i=1;i<=n;i++) {p[i]=i;num[i]=1;cnt[i]=0;} 40 while(m--) 41 { 42 char op[2]; 43 scanf("%s",op); 44 if(op[0]=='T') 45 { 46 int x,y; 47 scanf("%d%d",&x,&y); 48 int xx = finds(x); 49 int yy = finds(y); 50 if(xx!=yy) 51 { 52 p[xx]=yy; 53 cnt[xx]++; 54 num[yy]+=num[xx]; 55 num[xx]=0; 56 } 57 } 58 else 59 { 60 int x; 61 scanf("%d",&x); 62 int ans = finds(x); 63 printf("%d %d %d ",ans,num[ans],cnt[x]); 64 } 65 } 66 } 67 return 0; 68 }