P2814 家谱

菜鸟生成记(45)

思路:并查集+map<string,string>

如果把这些字符串改为数字,这一题的就非常简单,就成了一个并查集模板题了;这一题难就难在map这个数据结构的理解和使用;

—>大佬的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
$
*/

洛谷 P2814 家谱相关推荐

  1. 并查集——家谱(洛谷 P2814)

    题目选自洛谷P2814 由于是字符串保存名字,使用数字对应数组来合并查找有一点麻烦,所以使用map将对应关系存起来即可. 因为map带有映射关系,好像不需要再写初始化和合并操作,用两个字符串变量,一个 ...

  2. 洛谷题解——P2814 家谱

    题目相关 题目链接 洛谷,https://www.luogu.com.cn/problem/P2814. MYOJ,http://47.110.135.197/problem.php?id=5344. ...

  3. 二叉树——美国血统(洛谷 P1827)

    题目选自洛谷P1827 根据前序.中序遍历求出后序遍历,这也是二叉树很重要且基本的知识,还是有必要练练. 至于什么是前.中.后序遍历,这里就不再过多讲述. 用手模拟求解是简单的,接下来看看如何用代码来 ...

  4. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  5. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  6. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  7. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  8. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

  9. 洛谷P1417 烹调方案

    洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...

最新文章

  1. Android画图学习总结(四)——Animation(上)
  2. Sublime Text3常用插件以及安装方法(实用)
  3. 虚拟机复制后修改eth1为eth0
  4. 虚拟机做linux服务器,用 VirtualBox 的 linux 虚拟机做服务器
  5. 此上下文中不支持函数定义。请在代码文件中创建函数。_深入解析Python上下文管理器,让你不再迷茫!...
  6. 神经网络前向引擎内存复用技术(基于caffe)
  7. SAP Spartacus organization unit里org list的focus实现问题
  8. Wireshark笔记-ping,arp相关的实验(2台主机是否能通)
  9. SharePoint 2010认证模式
  10. iis 下的 selfssl
  11. Android IOS WebRTC 音视频开发总结(六三)-- 2016国内IM云服务行业分析
  12. 如何解决VS2017打开安装包运行报错问题
  13. diabetes影响因子2017_2017年SCI影响因子发布,几家欢喜几家愁
  14. mobi电子书如何用Windows电脑阅读?
  15. mysql 嵌套查询优化
  16. 企业电子邮件营销策略(Email营销策略)
  17. 谈微信里的“养生“谣言
  18. Java使用阿里云视频点播
  19. 汇编程序:查表求平方
  20. 如何介绍自己测试过的项目

热门文章

  1. MYSQL between用法
  2. 【软考-软件设计师精华知识点笔记】第六章 系统开发与运行
  3. 03 买什么基金合适
  4. 教务辅助管理系统mysql_数据库程序设计---教务辅助管理系统.doc
  5. 自己动手写类似酷狗播放器(2)_音乐播放模块实现
  6. UVA 10600 Masud Rana
  7. firefox 离线模式
  8. 第十八届全国大学智能汽车竞赛报名信息统计:东北赛区报名队伍
  9. 拼多多的智慧农业探索价值
  10. layer ui ajax 样式,layerUi与AJAX的一种思路