• 洛谷 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

    解题思路

      map + 并查集;

    代码如下

     1 #include<map>
     2 #include<iostream>
     3 using namespace std;
     4 map<string, string> father;
     5 string getf(string x){
     6     if(x == father[x])    return x;
     7     else    return father[x] = getf(father[x]);
     8 }
     9 int main(){
    10     string fath;
    11     while(1){
    12         string son, temp;
    13         char c;
    14         cin >> c;
    15         if(c == '$')    break;
    16         else if(c == '#'){
    17             cin >> fath;
    18             if(father[fath] == "")    father[fath] = fath;    
    19         }
    20         else if(c == '+'){
    21             cin >> son;
    22             father[son] = fath;
    23         }
    24         else if(c == '?'){
    25             cin >> temp;
    26             cout << temp << " " << getf(temp) << endl;
    27         }
    28     }
    29     return 0;
    30 }
    家谱

    注意点

      变量定义的位置得仔细考虑一下;

  • 相关阅读:
    c# 02-18 值类型 引用类型 字符串的不可变性 字符串的处理方法
    c#0218-命名空间
    c#学习0217
    BootStrap学习
    c#学习0216
    AngularJS学习
    java面试题之什么是死锁、活锁、饿死和竞态条件?
    java面试题之能创建volatile数组吗?
    java面试题之sleep()和wait()方法的区别
    java面试题之Thread的run()和start()方法有什么区别
  • 原文地址:https://www.cnblogs.com/zoom1109/p/11045206.html
Copyright © 2020-2023  润新知