说明 在网络社交的过程中,通过朋友,也能认识新的朋友。在某个朋友关系图中,假定 A 和 B 是朋友,B 和 C 是朋友,那么 A 和 C 也会成为朋友。即,我们规定朋友的朋友也是朋友。
现在要求你每当有一对新的朋友认识的时候,你需要计算两人的朋友圈合并以后,朋友圈内名字字典序最小的那个人的名字。
输入格式 第一行:一个整数 n ( 1 ≤ n ≤ 50000 ) n(1≤n≤50000),表示有 n n 对朋友认识。
接下来 n n 行:每行输入两个名字。表示新认识的两人的名字,用空格隔开。(名字是一个首字母大写后面全是小写字母且长度不超过 20 20 的串)。
输出格式 对于每一对新认识的朋友,输出合并以后朋友圈内名字字典序最小的那个人的名字,每个输出占一行。 样例 输入数据 1
3
Fred Barney
Barney Aetty
Betty Wilma
输出数据 1
Barney
Aetty
Betty
样例错误代码:
#include <bits/stdc++.h>
using namespace std;
struct node{
string mi,dad;
};
map <string,node> fa;
int n;
string u,v;
pair <string,string> Find(node x){
string root=x.dad,mi="zzzzzzzzzzzzzzzzzzzzzzzzzzz";
while (fa[root].dad!=root){
root=fa[root].dad;
if (fa[root].mi<mi) mi=fa[root].mi;
}
string i=x.dad,tmp="0";
while (fa[i].dad!=root){
tmp=fa[i].dad;
fa[i].dad=root;
i=tmp;
}
return {root,mi};
}
int main(){
cin>>n;
for (int i=1;i<=n;i++){
cin>>u>>v;
node n1,n2;
n1.mi=u,n2.mi=v,n1.dad=u,n2.dad=v;
fa.insert({u,n1});
fa.insert({v,n2});
pair <string,string> p1=Find(fa[u]),p2=Find(fa[v]);
if (p1.first!=p2.first){
if (u<v) fa[fa[v].dad].dad=u;
else fa[fa[u].dad].dad=v;
}
if (p1.second<p2.second) cout<<p1.second<<"\n";
else cout<<p2.second<<"\n";
}
return 0;
}
并查集qwq,输出了三排z