样例过,但是0分,求助
  • 板块P2814 家谱
  • 楼主wxw_zl
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/2/28 20:48
  • 上次更新2023/10/23 23:29:28
查看原帖
样例过,但是0分,求助
469487
wxw_zl楼主2023/2/28 20:48

代码:

#include<bits/stdc++.h>
using namespace std;
map<string,int>mp;
map<int,string>mp2;
string ns,fs;
int father[50050],cnt;
int find(int m) {
	if(father[m]!=m)
		father[m]=find(father[m]);
	return father[m];
}
void join(int a,int b) {
	int fa=find(a),fb=find(b);
	if(fa!=fb) {
		father[fb]=fa;
	}
}
int main() {
	for(int i=0;i<50050;i++)
		father[i]=i;
	while(1) {
		getline(cin,ns);
		if(ns[0]=='#') {
			fs=ns.substr(1);
			mp.insert(pair<string,int>(fs,++cnt) );
			mp2.insert(pair<int,string>(cnt,fs));
		} else if(ns[0]=='+') {
			ns=ns.substr(1);
			mp.insert(pair<string,int>(ns,++cnt));
			mp2.insert(pair<int ,string>(cnt,ns));
			join(mp[fs],mp[ns]);
		} else if(ns[0]=='?') {
			ns=ns.substr(1);
			cout<<ns<<" "<<mp2[find(mp[ns])]<<endl;
		} else if(ns[0]=='$')break;
	}
	return 0;
}

思路:运用并差集+map将父亲和孩子合并,以此找到真正的祖先。

2023/2/28 20:48
加载中...