【洛谷P2814】家谱

今天学了一种新的STL(笑)

先看题目

P2814 家谱

题目背景

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

题目描述

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

输入格式

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

输出格式

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

输入输出样例 #1

输入 #1

#George
+Rodney
#Arthur
+Gareth
+Walter
#Gareth
+Edward
?Edward
?Walter
?Rodney
?Arthur
$

输出 #1

Edward Arthur
Walter Arthur
Rodney George
Arthur Arthur

说明/提示

规定每个人的名字都有且只有 \(6\) 个字符,而且首字母大写,且没有任意两个人的名字相同。最多可能有 \(10^3\) 组父子关系,总人数最多可能达到 \(5 \times 10^4\) 人,家谱中的记载不超过 \(30\) 代。

解法&&个人感想

个人感觉这题的并查集思路不是很复杂
但是看到字符串就有点犯怵
因此 我们介绍一种数据结构:map
map其实是一种映射 一般的写法是map<数据类型,数据类型>变量名
表示第一数据类型映射到第二数据类型
然后一般的调用写法是变量名[第一数据类型]=第二数据类型
好了 这样就很好做了
同时介绍一下map里面好用的成员函数
a.count(某个变量)在a里面找寻某个变量 如果存在返回1 不存在返回0
a.erase(某个变量)在a中删除以某个变量为下标的元素
a.size()计算a中元素个数
a.clear() 清空a
这些函数在后面会有很大的用处
下面看代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
map<string,string>fa;
char c;
string ance,son,s;
string get(string x){
    if(fa[x]==x) return x;
    return fa[x]=get(fa[x]);
}
int main(){
    while(cin>>c&&c!='$'){
        if(c=='#'){
            cin>>s;
            ance=s;
            if(fa[s]=="") fa[s]=s;
        }
        else if(c=='+'){
            cin>>s;
            fa[s]=ance;
        }
        else{
            cin>>s;
            cout<<s<<' '<<get(s)<<endl;
        }
    }
    system("pause");
    return 0;
}
posted @ 2025-02-16 09:01  Elainafan  阅读(17)  评论(0)    收藏  举报