唯一坑点:
while(scanf("%d",&t)!=EOF)
感谢DISCUSS大神
#include<cmath>
#include<cstdio>
#include<cstring>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 100010
map<string,int>mp;
int n,m,pre[MAX],sum[MAX];
void init()
{
for(int i=1;i<MAX;i++)
pre[i]=i,sum[i]=1;
}
int find(int x)
{
int r=x;
while(r!=pre[r])
r=pre[r];
int i=x,j;
while(pre[i]!=r)
{
j=pre[i];
pre[i]=r;;
i=j;
}
return r;
}
int uni(int a,int b)
{
int dx=find(a);
int dy=find(b);
if(dx!=dy)
{
pre[dx]=dy;
sum[dy]+=sum[dx];
}
return sum[dy];
}
int main()
{ int t;
while(scanf("%d",&t)!=EOF){
while(t--){
mp.clear();
scanf("%d",&n);
init();
int num=1;
char a[25],b[25];
while(n--)
{ int u,v;
scanf("%s%s",&a,&b);
if(mp[a]==0) mp[a]=num++;
if(mp[b]==0) mp[b]=num++;
u=mp[a];
v=mp[b];
int k= uni(u,v);
printf("%d\n",k);
}
}
}
return 0;
}