题目
你可以使用各种网站来结交虚拟朋友。对一些人来说,扩大他们的社交网络(他们的朋友,朋友的朋友,朋友的朋友的朋友,等等)已经成为一种上瘾的爱好。就像有些人收集邮票,有些人收集虚拟的朋友。
你的任务是观察这样一个网站上的互动,并跟踪每个人的网络规模。
假设每段友谊都是相互的。如果弗雷德是巴尼的朋友,那么巴尼也是弗雷德的朋友。
输入
输入文件包含多个测试用例。
每个案例的第一行表示测试友谊巢的数量。
每个友谊巢都以一行包含整数F的行开始,F是在这个友谊巢中形成的友谊的数量,不超过100,000。下面每一行都包含了刚刚成为朋友的两个人的名字,中间用空格隔开。名称是由1到20个字母(大写或小写)组成的字符串。
输出
每当一段友谊形成时,打印一行包含一个整数的行,即两个人在社交网络中刚刚成为朋友的人数。
#include <cstdio>
#include <cstring>
#include <map>
#define m(a,b) memset(a,b,sizeof a)
typedef long long ll;
using namespace std;
const int N=200005;
const int INF=0x3f3f3f3f;
int f[N],num[N];
template<class T>void rd(T &x)
{
x=0;int f=0;char ch=getchar();
while(ch<'0'||ch>'9') {f|=(ch=='-');ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
x=f?-x:x;
return;
}
int seek(int x)
{
if(x==f[x])
return x;
return f[x]=seek(f[x]);
}
map<string,int>mmp;
int main() {
int T;
char s1[25],s2[25];
while(~scanf("%d",&T)) {
while(T--) {
int m,cnt=0;
rd(m);
for(int i=1; i<N; i++)
f[i]=i,num[i]=1;
mmp.clear();
while(m--) {
scanf("%s%s",s1,s2);
if(!mmp[s1])
mmp[s1]=++cnt;
if(!mmp[s2])
mmp[s2]=++cnt;
int a=mmp[s1],b=mmp[s2];
int ra=seek(a),rb=seek(b);
if(ra!=rb)
f[ra]=rb,num[rb]+=num[ra];
printf("%d\n",num[rb]);
}
}
}
}