第一行:一个整数 n(n\leq 5000)n(n≤5000),表示有 nn对朋友认识。
接下来 nn 行:每行输入两个名字。表示新认识的两人的名字,用空格隔开。(名字是一个首字母大写后面全是小写字母且长度不超过 20 的串)。
输出格式
对于每一对新认识的朋友,输出合并以后的朋友圈的大小。
样例输入
3 Fred Barney Barney Betty Betty Wilma
样例输出
2 3 4
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#include<map>
int size[5010];
int father[5010];
map<string,int> m; //结合题意,采用这样的对应。
int get(int a)
{
if(father[a]==a)
return a;
return get(father[a]);
}
void add(int a,int b)
{
a=get(a);
b=get(b);
if(a!=b)
{
father[a]=b;
size[b]+=size[a];
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=5010;i++)
{
father[i]=i;
size[i]=1;
}
int pos=1;
while(n--)
{
string a,b;
cin>>a>>b;
if(m.count(a)==0)
m[a]=pos++;
if(m.count(b)==0)
m[b]=pos++;
add(m[a],m[b]);
cout<<size[get(m[b])]; //注意!对于size的更新都是针对根节点而言,所以最后取也是取根节点的size。
if(n!=0)
cout<<endl;
}
return 0;
}
学到的点:
这种题意典型就可以想成树结构(一条链子嘛)。
而且我发现一个问题:memset只能将int型数组初始化为0或-1!!!!
所以如果要初始化数组为全为其他数,必须用for循环。(如果声明时写dist[maxn]={1},只会让dist[0]=1,其他还是默认为0,就很烦)