不会并查集的话请将此文与我以前写的并查集一同食用。

原题来自洛谷

原题

文字稿在此:

题目背景

现代的人对于本家族血统越来越感兴趣。

题目描述

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

输入输出格式

输入格式:
输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用#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题解)的更多相关文章

  1. 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 ...

  2. 浅谈并查集&种类并查集&带权并查集

    并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...

  3. 洛谷1525 关押罪犯NOIP2010 并查集

    问题描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两 ...

  4. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  5. Codeforces 938G Shortest Path Queries [分治,线性基,并查集]

    洛谷 Codeforces 分治的题目,或者说分治的思想,是非常灵活多变的. 所以对我这种智商低的选手特别不友好 脑子不好使怎么办?多做题吧-- 前置知识 线性基是你必须会的,不然这题不可做. 推荐再 ...

  6. 并查集 牛客练习赛41 C抓捕盗窃犯

    题目链接 :https://ac.nowcoder.com/acm/contest/373/C 题意,初始每一个城市都有一伙盗贼,没过一个时刻盗贼就会逃窜到另一个城市,你可以在m个城市设置监察站,会逮 ...

  7. poj1182 食物链【并查集-好题!】

    动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.  现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两 ...

  8. hiho #1066 : 无间道之并查集

    #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息……额,说远了,总之,小Hi和小H ...

  9. poj1703 Find them, Catch them(带权并查集)

    题目链接 http://poj.org/problem?id=1703 题意 有两个帮派:龙帮和蛇帮,两个帮派共有n个人(编号1~n),输入m组数据,每组数据为D [a][b]或A [a][b],D[ ...

随机推荐

  1. HTTP_1_Web及网络基础

    Web使用一种HTTP(HyperText TransFer Protocol,超文本协议)的协议作为规范,完成从客户端到服务器等一系列运作流程.可见web是建立在HTTP协议上通信的. 通常我们使用 ...

  2. Linux系统命令。

      help:命令用于显示shell内部命令的帮助信息.help命令只能显示shell内部的命令              帮助信息.而对于外部命令的帮助信息只能使用man或者info命令查看   m ...

  3. 【Mac】解压文件夹中文乱码

    Mac 用的英文系统,发现下载含中文的文件后,解压为乱码,如图所示: 解决方法: 下载一个解压软件:"The Unarchiver" 安装后设置下,如图: 之后设置压缩文件的默认打 ...

  4. 跟着大彬读源码 - Redis 9 - 对象编码之 三种list

    目录 1 ziplist 2 skiplist 3 quicklist 总结 Redis 底层使用了 ziplist.skiplist 和 quicklist 三种 list 结构来实现相关对象.顾名 ...

  5. 一文了解:Redis的RDB持久化

    一文了解:Redis的RDB持久化 Redis是内存数据库,为了保证数据不在故障后丢失,Redis需要将数据持久化到硬盘上. Redis持久化有两种方式:一种是快照,全量备份.一种是AOF方式,连续增 ...

  6. 【作品】超实用C++分数类

    引言 我们说,编程语言的精髓在于封装,而面向对象语言完胜面向过程语言的原因就是具有更好的可封装性,而C++就是这样的一种多范型语言,常用而复杂的工作完全不必在每一份源文件中重敲,就好像我们不需要自己手 ...

  7. iview中page组件的跳转功能BUG解决方案

    xl_echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! 在 ...

  8. jq css3实现跑马灯+大转盘

    前端效果, <!DOCTYPE HTML><html><head> <meta http-equiv="Content-Type" con ...

  9. 大数据学习之旅1——HDFS版本演化

    最近开始学习大数据,发现大数据有很多很多组件,我现在负责的是HDFS(Hadoop分布式储存系统)的学习,整理了一下HDFS的版本情况.因为HDFS是Hadoop的重要组成部分,所以有关HDFS的版本 ...

  10. 【Python3爬虫】爬取美女图新姿势--Redis分布式爬虫初体验

    一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...