此题用一般的方法查找会超时,所以要用到cmp容器来查找;
对于cmp是一个会自动排序的容器,利用find函数可以快速查找是否含有某个数;
#include<stdio.h>
#include<string>
#include<iostream>
#include<map>
using namespace std;
map<string,int>A;
#define N 1000006
int pre[N];
int rank[N];
int find(int k)
{
if(k!=pre[k])
pre[k]=find(pre[k]);
return pre[k];
}
void Union(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
{
pre[y]=x;
rank[x]+=rank[y];
}
}
int main()
{
int m,i,n,j,k,h;
string a,b;
while(scanf("%d",&k)!=EOF)
{
while(k--)
{
A.clear();
n=0;
scanf("%d",&m);
while(m--)
{
cin>>a>>b;//这里要注意,a,b不能用scanf输入,只能用cin来输入;
if(A.find(a)==A.end())
{
A[a]=n;
pre[n]=n;
rank[n]=1;
n++;
}
if(A.find(b)==A.end())如果A中不含b,则添加。
{
A[b]=n;
pre[n]=n;
rank[n]=1;
n++;
}
Union(A[a],A[b]);
printf("%d\n",rank[find(A[a])]);
}
}
}
return 0;
}