并查集水题。。。输入输出有点麻烦。。。1800多ms。。。超时的边缘
#include <iostream>
#include <cstring>
#include <map>
#include <string>
using namespace std;
int father[100002];
int sum[100002];
int rank[100002];
int find(int x)
{
while (x!=father[x])
x=father[x];
return x;
}
void Union(int a,int b)
{
a=find(a);
b=find(b);
if (a==b)
return ;
if (rank[a]>rank[b])
{
father[b]=a;
sum[a]+=sum[b];
}
else
{
if (rank[a]=rank[b])
rank[b]++;
father[a]=b;
sum[b]+=sum[a];
}
}
void init()
{
memset (rank,0,sizeof(rank));
for (int i=1;i<=100000;i++)
{
father[i]=i;
sum[i]=1;
}
}
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
for (int i=1;i<=n;i++)
{
map <string,int> mymap;
init();
int t;
cin>>t;
string s1,s2;
int s=1;
for (int k=1;k<=t;k++)
{
cin>>s1>>s2;
int a=mymap[s1];
int b=mymap[s2];
if (a==0)
{
mymap[s1]=s;
a=s;
s++;
}
if (s1!=s2)
{
if (b==0)
{
mymap[s2]=s;
b=s;
s++;
}
}
else
b=a;
Union(a,b);
printf("%d\n",sum[find(a)]);
}
}
}
}