现在,你可以在网上做各种事情。例如,您可以使用各种网站来结交虚拟朋友。对一些人来说,发展他们的社交网络(朋友、朋友的朋友、朋友的朋友等)已经成为一种上瘾的爱好。就像有些人集邮一样,其他人也集邮虚拟朋友。
你的任务是观察这样一个网站上的互动,并跟踪每个人的网络规模。
假设每一种友谊都是相互的。如果弗雷德是巴尼的朋友,那么巴尼也是弗雷德的朋友。
输入
输入文件包含多个测试用例。
每个案例的第一行指示测试友谊嵌套的数量。
每一个友谊巢都以一个整数f开头,即在这个友谊巢中形成的友谊数,不超过100000。下面的每一行F都包含两个刚成为朋友的人的名字,用空格隔开。名称是由1到20个字母(大写或小写)组成的字符串。
输出
每当友谊形成时,打印一行包含一个整数,即两个人在社交网络中刚成为朋友的人数。
1
3
Fred Barney
Barney Betty
Betty Wilma
Sample Output
2
3
4
这道题目最后是问刚刚输入的这两个人,进到一个团体中(如果是一开始的话,团体是0人;如果不是一开始,里面肯定是有人的,看看刚刚输入的这两个人在这个团体里面能形成几个新的朋友关系,这里有可能没有读懂题目的意思,不知道怎么来做),题目给出的是字符串的数据,那我们就将这个字符串转化为数字,使用map<string,int>mp 将字符串转化为数字,然后就是带权并查集。
代码:
还有个坑点,使用G++交,各种错误,一开始为TLE ,后来是OLE ,后来是WA,一交C++就过了
#include<iostream>
#include<cstdio>
#include<string>
#include<string.h>
#include<map>
const int maxn=100010;
using namespace std;
int num;
int pre[maxn];
int sum[maxn];
void init()
{
for(int i=1;i<=maxn;i++)
{
pre[i]=i;
sum[i]=1;
}
}
int find(int x)
{
return x==pre[x]?x:pre[x]=find(pre[x]);
}
void join(int x,int y)
{
int a=find(x);
int b=find(y);
if(a!=b)
{
pre[a]=b;
sum[b]+=sum[a];
}
}
int main()
{
int t;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
string a,b;
map<string,int>mp;
int tot=0;
scanf("%d",&num);
init();
for(int i=0;i<num;i++)
{
cin>>a>>b;
if(!mp[a])
mp[a]=++tot;
if(!mp[b])
mp[b]=++tot;
join(mp[a],mp[b]);
int k=find(mp[a]);
printf("%d\n",sum[k]);
}
}
}
return 0;
}