此題用一般的方法查找會超時,所以要用到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;
}