c++并查集配合STL MAP的实现(洛谷P2814题解)
不会并查集的话请将此文与我以前写的并查集一同食用。
原题来自洛谷
原题
文字稿在此:
题目背景
现代的人对于本家族血统越来越感兴趣。
题目描述
给出充足的父子关系,请你编写程序找到某个人的最早的祖先。
输入输出格式
输入格式:
输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字;接下来用?name的形式表示要求该人的最早的祖先;最后用单独的一个$表示文件结束。
输出格式:
按照输入文件的要求顺序,求出每一个要找祖先的人的祖先,格式:本人的名字+一个空格+祖先的名字+回车。
输入输出样例
输入样例#1:
#George
+Rodney
#Arthur
+Gareth
+Walter
#Gareth
+Edward
?Edward
?Walter
?Rodney
?Arthur
$
输出样例#1:
Edward Arthur
Walter Arthur
Rodney George
Arthur Arthur
说明
规定每个人的名字都有且只有6个字符,而且首字母大写,且没有任意两个人的名字相同。最多可能有1000组父子关系,总人数最多可能达到50000人,家谱中的记载不超过30代。
map
map是STL中的一种数据结构,你可以理解为它是一个下表不一定 为整形的数组(也就是说,下表可以为字符、字符串。。。)
map类型的声明
大体模式式是
map<下标类型,数组每一个元素的类型> 数组名;
比如说我要一个下表是字符串,每一个元素的类型也是字符串,名字叫a的数组,我可以这样写
map<string,string> a;
回到题目
会了map,相信你应该也有点思路了吧?这是 建立在并查集基础上的,不会并查集的话,可以看看我以前写的并查集。
有了map我们就可以使用 真正意义上的字符串数组来编程了!!!
函数
这里面的getfather函数 变异了,他成了这样
string getfather(string x)//找x的根结点
{//这其实是一个递归函数
if(father[x]!=x)
{
return getfather(father[x]);//它会一级一级找上去(先找到它爸爸,在找到它爸爸的爸爸,再找到它爸爸的爸爸的爸爸。。。。。)
}
else
{
return father[x];//边界条件,如果x的根结点就是x(也就是说它没有更上边的祖宗了)
}
}
相较以前的getfather,首先函数的类型成了string,而且x的类型也是string。但是作用和以前是一样的。
读入
这题的读入很特殊,因为这道题要边读入边处理边输出
char c;//就是名字 前面那个字符
string s,fat;//s是名字,fat是是用来暂存先提及的父亲的名字的
这题我用了这几个变量。
核心代码如下
map<string,string> father;//用来存储某一点的根结点
cin>>c;//读入c
while(c!='$')//只要c不是$就会执行
{
cin>>s;//读入名字
if(c=='#')//假如读到了父亲 的名字
{
fat=s;//fat暂存父亲的名字,因为过一会儿s的值会变
if(father[s]=="") father[s]=s;//如果father[s]的值为空,也就是说s就是自己的根结点(找到底了)
}
if(c=='+')//如果s是表示儿子
{
father[s]=fat;//s的根结点就成了fat(上面说的fat这是就派上了用场)
}
if(c=='?')//查集
{
cout<<s<<' '<<getfather(father[s])/*输出father[s]的根结点*/<<endl;
}
cin>>c;//读入c,开始新一轮的循环
}
完整程序如下
#include<map>
#include<iostream>
using namespace std;
map<string,string> father;
string getfather(string x)
{
if(father[x]!=x)
{
return getfather(father[x]);
}
else
{
return father[x];
}
}
int main()
{
char c;
string s,fat;
cin>>c;
while(c!='$')
{
cin>>s;
if(c=='#')
{
fat=s;
if(father[s]=="") father[s]=s;
}
if(c=='+')
{
father[s]=fat;
}
if(c=='?')
{
cout<<s<<' '<<getfather(father[s])<<endl;
}
cin>>c;
}
return 0;
}
总结
这题其实和并查集的模版的差异并不大,只是涉及到STL中的数据结构map的使用。所以对于提高+的评价感觉是过了点,但要是不会map的话可能真的是这个难度了。
如果字符串功底够好,也可以 考虑用字符串/字符 数组来实现(我字符串功底不好。。)
tks。
c++并查集配合STL MAP的实现(洛谷P2814题解)的更多相关文章
- Codeforces 1131 F. Asya And Kittens-双向链表(模拟或者STL list)+并查集(或者STL list的splice()函数)-对不起,我太菜了。。。 (Codeforces Round #541 (Div. 2))
F. Asya And Kittens time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 浅谈并查集&种类并查集&带权并查集
并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...
- 洛谷1525 关押罪犯NOIP2010 并查集
问题描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两 ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- Codeforces 938G Shortest Path Queries [分治,线性基,并查集]
洛谷 Codeforces 分治的题目,或者说分治的思想,是非常灵活多变的. 所以对我这种智商低的选手特别不友好 脑子不好使怎么办?多做题吧-- 前置知识 线性基是你必须会的,不然这题不可做. 推荐再 ...
- 并查集 牛客练习赛41 C抓捕盗窃犯
题目链接 :https://ac.nowcoder.com/acm/contest/373/C 题意,初始每一个城市都有一伙盗贼,没过一个时刻盗贼就会逃窜到另一个城市,你可以在m个城市设置监察站,会逮 ...
- poj1182 食物链【并查集-好题!】
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两 ...
- hiho #1066 : 无间道之并查集
#1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息……额,说远了,总之,小Hi和小H ...
- poj1703 Find them, Catch them(带权并查集)
题目链接 http://poj.org/problem?id=1703 题意 有两个帮派:龙帮和蛇帮,两个帮派共有n个人(编号1~n),输入m组数据,每组数据为D [a][b]或A [a][b],D[ ...
随机推荐
- Android的日期选择器
TimePicker(时间选择器) 方法 描述 Integer getCurrentHour () 返回当前设置的小时 Integer getCurrentMinute() 返回当前设置的分钟 boo ...
- python语言快捷注释
1.注释单行 (1)方法1:直接在单行代码前边加 # (2)方法2:选中需要注释的代码,Ctrl+/ 即可注释 2.注释多行代码 选中想要注释的N行代码,直接Ctrl+/ 即可注释 3.取消注释多行代 ...
- 【python-django后端开发】Redis缓存配置使用详细教程!!!
官方查阅资料:https://django-redis-chs.readthedocs.io/zh_CN/latest/ 1. 安装django-redis扩展包 1.安装django-redis扩展 ...
- (14)ASP.NET Core 中的日志记录
1.前言 ASP.NET Core支持适用于各种内置和第三方日志记录提供应用程序的日志记录API.本文介绍了如何将日志记录API与内置提供应用程序一起使用. 2.添加日志提供程序 日志记录提供应用程序 ...
- eclipse使用(一)
使用eclipse时,编写对象的返回值非常麻烦,而使用返回值快捷键可以简化这一过程. 第一种 Alt+shift+L 将光标放在有返回值的代码句的分号后面: Resources.getResource ...
- HTML/CSS:block,inline和inline-block概念和区别
总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通 ...
- 01、VM安装教程
1.运行下载完成的Vmware Workstation虚拟机软件包,将会看到如图所示,然后点击“下一步”按钮, 2.在最终用户许可协议界面选中“我接受许可协议中的条款”复选框,然后点击“下一步”按钮 ...
- tensorflow学习笔记——图像识别与卷积神经网络
无论是之前学习的MNIST数据集还是Cifar数据集,相比真实环境下的图像识别问题,有两个最大的问题,一是现实生活中的图片分辨率要远高于32*32,而且图像的分辨率也不会是固定的.二是现实生活中的物体 ...
- 单纯的xlistview
public class MainActivity extends AppCompatActivity implements XListView.IXListViewListener{ private ...
- 深入理解ES6之——代理和反射(proxy)
通过调用new proxy()你可以创建一个代理来替代另一个对象(被称为目标),这个代理对目标对象进行了虚拟,因此该代理与该目标对象表面上可以被当做同一个对象来对待. 创建一个简单的代理 当你使用Pr ...