
洛谷 P2814 家谱
发布日期:2021-05-06 16:16:28
浏览次数:31
分类:原创文章
本文共 1646 字,大约阅读时间需要 5 分钟。
菜鸟生成记(45)
思路:并查集+map<string,string>
如果把这些字符串改为数字,这一题的就非常简单,就成了一个并查集模板题了;这一题难就难在map这个数据结构的理解和使用;
—>
抓耳挠腮近一个小时完全没思路,就只知道要用并查集;同学的一个map思路点醒了我;爽!今晚可以睡个好觉了;
#include<iostream>#include<string>#include<map>#include<vector>#define son string//定义一个string的别名 #define fat string//定义一个string的别名using namespace std;map<son,fat>m;//定义一个map容器 map<son,fat>::iterator it;//map<string,string>类型的迭代器 vector<string> str1,str2,str;//定义三个容器,储存字符串 void find1(string s)//找祖先函数 { //这就是个并查集,因为下标是字符串,所以看着有点绕;//把字符串想象成独一无二的数字下标 string t=s,s1; while(t!="")//m[t]=="";说明t没有父亲,即t是祖先 { if(m[t]!="") s1=m[t];//记录s的祖先 t=m[t]; } m[s]=s1;//这一步是并查集中的压缩路径(缩短到祖先的步数) //直接认祖先为父 }int main(){ string x,t; while(cin>>x&&x!="$") { if(x[0]=='?')//要查询祖先的人 { str2.push_back(x);//容器str2储存 查询祖先的人 } else//#和+开头的是父子关系 { t=x; t.erase(0,1); m.insert(make_pair(t,""));//map容器<string,string> 以字符串为下标, //开始时,每个人的父亲都为空 str1.push_back(x);//容器str1储存 父子关系 } x.clear(); } for(int i=0;i<str1.size();i++)//确定父子关系 { if(str1[i][0]=='#')//#开头的人的后面+开头的人,都是#开头的儿子 { string f=str1[i],t; f.erase(0,1);//删除开头的#字符 for(int j=i+1;j<str1.size();j++) { if(str1[j][0]=='#')//再遇一个#开头的人,就是下一个爸爸了,所以结束 break; t=str1[j];//str1[i]的儿子 t.erase(0,1);//删除开头的+字符 m[t]=f;//以儿子t为下标,值储存的父亲的名字 } } } for(it=m.begin();it!=m.end();it++) { find1(it->first);//寻找儿子的祖先 } for(int i=0;i<str2.size();i++)//查询 { string t=str2[i].erase(0,1); if(m[t]!="")//输出自己和祖先 cout<<t<<" "<<m[t]<<endl; else//没有父亲的,输出自己和自己(自己是自己的父亲) cout<<t<<" "<<t<<endl; } return 0;}/*#George+Rodney#Arthur+Gareth+Walter#Gareth+Edward?Edward?Walter?Rodney?Arthur$*/
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月26日 00时21分08秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【CSS进阶】伪元素的妙用--单标签之美
2019-03-06
开始CN的生活
2019-03-06
惊闻NBC在奥运后放弃使用Silverlight
2019-03-06
IE下尚未实现错误的原因
2019-03-06
Kubernetes 学习系列文章
2019-03-06
创建自己的Docker基础镜像
2019-03-06
使用Jenkins来实现内部的持续集成流程(上)
2019-03-06
HTTP 协议图解
2019-03-06
Python 简明教程 --- 20,Python 类中的属性与方法
2019-03-06
Python 简明教程 --- 21,Python 继承与多态
2019-03-06
KNN 算法-理论篇-如何给电影进行分类
2019-03-06
Spring Cloud第九篇 | 分布式服务跟踪Sleuth
2019-03-06
CODING 敏捷实战系列课第三讲:可视化业务分析
2019-03-06
使用 CODING DevOps 全自动部署 Hexo 到 K8S 集群
2019-03-06
工作动态尽在掌握 - 使用 CODING 度量团队效能
2019-03-06
CODING DevOps 代码质量实战系列最后一课,周四发车
2019-03-06
CODING DevOps 深度解析系列第二课报名倒计时!
2019-03-06
CODING DevOps 线下沙龙回顾二:SDK 测试最佳实践
2019-03-06
翻译:《实用的Python编程》03_01_Script
2019-03-06
Kwp2000协议的应用(程序后续篇)
2019-03-06