【并查集】家谱
发布日期:2021-05-07 22:49:10 浏览次数:19 分类:精选文章

本文共 941 字,大约阅读时间需要 3 分钟。

洛谷【P2814】

给出充足的父子关系,请你编写程序找到某个人的最早的祖先。

Input

输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字;接下来用?name的形式表示要求该人的最早的祖先;最后用单独的一个$表示文件结束。

Output

按照输入文件的要求顺序,求出每一个要找祖先的人的祖先,格式:本人的名字+一个空格+祖先的名字+回车。


不管,我就是不用map!!!校网TLE是因为评测机卡!!!

将字符串以序号,然后普通并查集。

#include
#include
#include
#include
using namespace std;int t,ff,z,f[50001];char c;string ss,s;int find(int d){ if(f[d]!=d) f[d]=find(f[d]); return f[d];}int fa(string ls){ //寻找ls是第几个 int kk=ss.find(ls); if(kk<0){ //如果没有,存下来。 ss+=ls; ++t; f[t]=t; } else return kk/6+1; //不然输出他是第几个(因为名字长度固定为6位) return t;}int main(){ c=getchar(); while(c!='$'){ while(c!='#'&&c!='+'&&c!='?'&&c!='$') c=getchar(); if(c=='$') break; if(c=='#'){ cin>>s; ff=fa(s); } else{ cin>>s; z=fa(s); if(c=='+') f[find(z)]=find(ff); //合并 else if(c=='?') cout<
<<' '<
<
上一篇:【并查集】黑魔法师之门
下一篇:【并查集】矩形

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年03月23日 16时17分19秒