家谱(gen)

题目描述

输入文件名  GEN.IN

输出文件名    GEN.OUT

时间限制      2S

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

输入

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

输出

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

样例

GEN.IN

#George

+Rodney

#Arthur

+Gareth

+Walter

#Gareth

+Edward

?Edward

?Walter

?Rodney

?Arthur

$

GEN.OUT

Edward Arthur

Walter Arthur

Rodney George

Arthur Arthur

分析

一边输入一遍输出

输入主要是判断第一个字符是# +还是?

因为这个关系到输出

用 do while循环输入就可以

结构体四个参数 num父结点编号 numself自己的编号 s父结点的名字 sself自己的名字

输入的时候 默认为父结点为自己 输入的时候还要挨个判断里面是否已经放过了

这就要for循环 (会超时~)

可以路径压缩

错误1:b=m s2=s1位置放错 把 if(father[m].num==0)和 if(ch==‘#‘)放到一起

   应该只要是输入#号 就存一下m 和 s1

   如果把条件合并 那么已经放过父结点的结点即使再是父结点也无法更新

错误2:如果已经做过父结点 就不会再做子结点

   在if(ch==‘+‘)里面修改 判断一下

   既然能判断 就一定输入加号 再判断它的父结点是否和本身相等

   或者压根没放过父结点 就存下来m 和 s1

代码

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
struct ff{
    int numself;
    int num;
    string s;
    string sself;
};
ff father[50005];
int find(int);
int main()
{
//    freopen("GEN.IN","r",stdin);
//    freopen("GEN.OUT","w",stdout);
    int m=0,b,n=0;
    char ch;
    string s1,s2;
    do
    {
    m=n;
    m++;
    n++;
    cin>>ch>>s1;
    for(int i=1;i<=m;i++)
        if(father[i].sself==s1)
        {
            n=m;
            m=i;
            break;
        }
    if(ch==‘#‘)
        {
            if(father[m].num==0)
            {
            father[m].numself=m;
            father[m].sself=s1;
            father[m].num=m;
            father[m].s=s1;
            }
        b=m;
        s2=s1;
        }
    if(ch==‘+‘)
        {
            father[m].numself=m;
            father[m].sself=s1;
            if(father[m].s==father[m].sself||father[m].num==0)
            {
            father[m].num=b;
            father[m].s=s2;
            }
        }
    if(ch==‘?‘)
    {
        for(int i=1;i<=m;i++)
            if(father[i].sself==s1)
                {
                cout<<s1<<" "<<father[find(father[i].numself)].s<<endl;
                break;
                }
    }
    }
    while(ch!=‘$‘);
    return 0;
}
int find(int x)
{
    if(father[x].num!=x)
        father[x].num=find(father[x].num);
    return father[x].num;
}
时间: 2024-10-20 04:59:56

家谱(gen)的相关文章

家谱(gen)

时间限制  2S [问题描述] 现代的人对于本家族血统越来越感兴趣,现在给出充足的父子关系,请你编写程序找到某个人的最早的祖先. [输入格式]gen.in 输入文件由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系由二行组成,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字:接下来用?name的形式表示要求该人的最早的祖先:最后用单独的一个$表示文件结束.规定每个人的名字都有且只有6个字符,而且首字母大写,且没有任意两个人的名字相同.

家谱 要测试数据的在评论里发联系方式

家谱(gen) 时间限制  2S [问题描述] 现代的人对于本家族血统越来越感兴趣,现在给出充足的父子关系,请你编写程序找到某个人的最早的祖先. [输入格式]gen.in 输入文件由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系由二行组成,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字:接下来用?name的形式表示要求该人的最早的祖先:最后用单独的一个$表示文件结束.规定每个人的名字都有且只有6个字符,而且首字母大写,且没有任意两

什么?php也能做爬虫?

php爬虫代码(爬去我的OJ题库为例) <?php for ($i=1000;;$i++){ $url = "http://localhost/JudgeOnline/problem.php?pid=$i"; //这儿填OJ地址 $info=file_get_contents($url); preg_match('|<title>(.*?)<\/title>|i',$info,$m); //获取标题 $title[$i][1]=$m[1]; if (!$m

家谱(gen)——洛谷P2814

1 #include <iostream> 2 #include <string> 3 #include <map> 4 using namespace std; 5 map < string, string > mp; 6 int main() 7 { 8 string s1 = "", s2 = ""; 9 while(cin >> s1) 10 { 11 mp.clear(); 12 while(s1

Android gen根目录下自动生成的R文件指向问题

今天才弄明白,原来在调用vitamio包的时候使用它们的R文件,然后在迁入广告的时候出现了问题,但是瞎胡搞半天后把问题解决了,可没有明白这是什么原因. 今天更新应用又出现了相同的情况,无意中打开了gen的根目录妈蛋!发现里面的报名根本就不是我现在应用的包名.而是调用的那个工程的包名!这下终于找到根本原因了,但是怎么解决呢???----------->修改包名呗~~~~~~~可是你改了它又会自动生成了原来的那个,--------------后来终于发现原来这个R文件的包名适合manifest文件中

洛谷 P2814 家谱

P2814 家谱 题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. 输入输出格式 输入格式: 输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字:接下来用?name的形式表示要求该人的最早的祖先:最后用单独的一个$表示文件结束. 输出格式: 按照输入文件的要求顺序,求出每一个要找祖先的

洛谷P1472 奶牛家谱 Cow Pedigrees

P1472 奶牛家谱 Cow Pedigrees 102通过 193提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 农民约翰准备购买一群新奶牛. 在这个新的奶牛群中, 每一个母亲奶牛都生两个小奶牛.这些奶牛间的关系可以用二叉树来表示.这些二叉树总共有N个节点(3 <= N < 200).这些二叉树有如下性质: 每一个节点的度是0或2.度是这个节点的孩子的数目. 树的高度等于K(1 < K < 100).高度是从

LLBL Gen Pro 5.0

LLBL Gen Pro 5.0 企业应用开发入门 Solutions Design 公司于2016年5月发布了LLBL Gen Pro 5.0,这个新版本的发布出乎于我的意料.我的猜想是从4.2升级到4.5,再升级5.x版本,主版本号的变更会给原有客户带来成本上的压力.299欧元的售价对于中小创业公司或大公司并不算便宜,在官网上查了一下最新的报价,如下表所示: Number of licenses Price per license Standard Price per license Plu

在Intel&#174; Galileo Gen 2开发板上运行Debian操作系统

    最近在研究Intel® Galileo Gen 2开发板的Linux开发.Intel® Galileo Gen 2开发板自带的Linux比较简单,缺少很多常用的软件,而且板子自身的容量很小.所以我打算在SD卡上运行Debian系统,这个系统里装有apt-get,缺少什么软件可以通过网络安装. 1. 下载Galileo的debian镜像.    到http://sourceforge.net/projects/galileodebian/下载Galileo的debian软件镜像galile