站外题求调
  • 板块学术版
  • 楼主shawn0618
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/22 20:22
  • 上次更新2024/11/22 21:53:34
查看原帖
站外题求调
374443
shawn0618楼主2024/11/22 20:22

说明 在网络社交的过程中,通过朋友,也能认识新的朋友。在某个朋友关系图中,假定 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

2024/11/22 20:22
加载中...