蛮简单的并查集
注意 若map中不存在对应的字符串到整数的映射
则默认映射为0
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#define maxn 111111
using namespace std;
int fa[maxn];
char a[maxn][30];
char b[maxn][30];
int big[maxn];
void init()
{
int i;
for(i=0;i<=maxn;i++)
fa[i]=i;
}
int seek(int x)
{
return fa[x]==x?x:fa[x]=seek(fa[x]);
}
void Merge(int u ,int v)
{
int fu = seek(u);
int fv = seek(v);
if(fu != fv) {
fa[fv] = fu ;
big[fu] += big[fv];
big[fv] = 0 ;
}
}
int main()
{
int t,n,i;
map<string,int> cnt;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
init();
//memset(big,1,sizeof(big));
scanf("%d",&n);
cnt.clear();
for(i=0;i<=maxn;i++)
{
//fa[i]=i;
big[i]=1;
}
int tot=1;//一开始赋成了0,则第一个数等于没有映射
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
if(!cnt[a[i]])
cnt[a[i]]=tot++;
//printf("Jesus1\n");
scanf("%s",b[i]);
if(!cnt[b[i]])
cnt[b[i]]=tot++;
//printf("Jesus2\n");
int aa=cnt[a[i]];
int bb=cnt[b[i]];
//printf("Jesus3\n");
Merge(aa,bb);
// printf("Jesus4\n");
int ans=seek(aa);
printf("%d\n",big[ans]);
}
}
}
return 0;
}