标签:
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6636 Accepted Submission(s): 1888
1 #include<iostream> 2 #include<stdio.h> 3 #include<map> 4 #include<string> 5 #define MAX(x,y) x>y?x:y 6 const int MAXN=100005; 7 using namespace std; 8 int fri[MAXN],num,now[MAXN]; 9 void initial(){ 10 for(int i=1;i<=MAXN;++i)fri[i]=i,now[i]=1; 11 } 12 int find(int x){ 13 /*if(x==fri[x])return x; 14 return fri[x]=find(fri[x]);*/ 15 int r=x; 16 while(r!=fri[r])r=fri[r]; 17 int i=x,j; 18 while(i!=r)j=fri[i],fri[i]=r,i=j; 19 return r; 20 } 21 void merge(int x,int y){ 22 int f1,f2; 23 f1=find(x);f2=find(y); 24 if(f1!=f2){ 25 fri[f2]=f1;now[f1]+=now[f2];//now[f2]=now[f1]; 26 //printf("now[%d]=%d\n",f1,now[f1]); 27 } 28 } 29 int main(){ 30 int T,N; 31 string A,B; 32 while(~scanf("%d",&T)){ 33 while(T--){map<string,int>m;initial();num=0; 34 scanf("%d",&N); 35 while(N--){ 36 cin>>A>>B; 37 if(m.find(A)==m.end())num++,m[A]=num; 38 if(m.find(B)==m.end())num++,m[B]=num; 39 // printf("%d %d\n",m[A],m[B]); 40 merge(m[A],m[B]); 41 printf("%d\n",now[find(m[A])]); 42 } 43 } 44 } 45 return 0; 46 } 47 /*1 48 7 49 a b 50 a a 51 a c 52 c g 53 g h 54 n n 55 h n 56 */
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/4685604.html