「LGOJ」家谱

题目描述

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

输入格式

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

Link

题解

找父亲可以马上想到并查集

但是这里的值都是字符串啊,怎么办呢qwq?

这时候就可以用map了 (STL大法好!

map <string,string> fa;

意思为建立一个特殊的数组,数组下标类型为string,数组存放的数据也是string类型的。然而它的本质还是普通数组,此处是将string类映射成int型。

此处用了map,就可以将输入的名字当成一个个整数(点),进行普通并查集即可。

Code

#include <bits/stdc++.h>
using namespace std;

#define RE register

map <string,string> fa;//映射qwq

string s,now;
char ch;

inline void fread(int &x){//快读
    x=0;
    int f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    x*=f;
}

inline string find(string x){//寻找父亲
    if(fa[x]==x)return x;
    return fa[x]=find(fa[x]);
}


int main(){
    cin>>ch;//注意这里要先输入再进入while,不然前面ch都为空
    while(ch!='$'){
        cin>>s;
        if(ch=='#'){
            now=s;
            if(fa[now]=="")fa[now]=now;//如果它不是儿子就创建一个父亲
        }
        if(ch=='+'){
            fa[s]=now;//合并qwq
        }
        if(ch=='?')cout<<s<<" "<<find(s)<<endl; //输出
        cin>>ch;
    }
    return 0;
}
posted @ 2021-08-13 11:29  sushitong  阅读(56)  评论(0)    收藏  举报