zoukankan      html  css  js  c++  java
  • 并查集——家谱

    题目描述

    现代的人对于本家族血统越来越感兴趣,现在给出充足的父子关系,请你编写程序找到某个人的最早的祖先。

    输入格式:

    输入文件由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系由二行组成,用#name 的形式描写一组父子关系中的父亲的名字,用+name 的形式描写一组父子关系中的儿子的名字;接下来用?name 的形式表示要求该人的最早的祖先;最后用单独的一个$表示文件结束。规定每个人的名字都有且只有 6 个字符,而且首字母大写,且没有任意两个人的名字相同。最多可能有 1000 组父子关系,总人数最多可能达到 50000 人,家谱中的记载不超过 30 代。

    输出格式:

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

    输入输出样例

    输入样例#1:
    #George
    +Rodney
    #Arthur
    +Gareth
    +Walter
    #Gareth
    +Edward
    ?Edward
    ?Walter
    ?Rodney
    ?Arthur
    $ 

    输出样例#1
    Edward Arthur
    Walter Arthur
    Rodney George
    Arthur Arthur
    其实一看就可以看出这是一道很裸的并查集题目。。。既然这么裸,那我就给一种不走寻常路的用STL——map的解法。
    用map把儿子和他的父亲连起来,然后就很好做了,不用转成序号再做
    代码奉上
    #include<cstdio>
    #include<iostream>
    #include<map>
    using namespace std;
    map<string,string>p;
    string find(string x)
    {
        if(x!=p[x]) 
        p[x]=find(p[x]);
        return  p[x];
    }
    string s,s1;
    int main()
    {
        char ch;
        cin>>ch;
        while(ch!='$')
        {
            cin>>s;
            if(ch=='#')
            {
                s1=s;
                if(p[s]=="") p[s]=s;
            }
            else if(ch=='+')
            p[s]=s1;
            else 
            cout<<s<<' '<<find(s)<<endl;    
            cin>>ch;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    主席树套树状数组——带修区间第k大zoj2112
    卢卡斯定理——应用hdu4349
    没这5个证 付完钱房子也不是你的!
    Java transient关键字使用小记
    线性结构与非线性结构
    java事件处理机制(自定义事件)
    反射setAccessible()方法
    排序
    [JIRA] 最新Linux安装版本jira6.3.6安装破解以及数据导入的详细步骤
    深入研究java.lang.ThreadLocal类
  • 原文地址:https://www.cnblogs.com/wty20010315/p/6690181.html
Copyright © 2011-2022 走看看