题意:
  今天是Ted的100岁生日。凑巧的是,他家族里面每个人都跟他同一天生日,但是年份不同。
  现在只给出一些 父亲的名字,孩子的名字,以及孩子出生时父亲的年龄,
  要求将Ted以外的家族成员按年龄降序排序,如果年龄相同,则按字母排序。

思路:遍历树。
  根据题意,可通过父子关系建立一个有权无向树,Ted作为树的根节点。通过从Ted所在节点开始遍历树,给每个节点赋值。
  最后根据每个成员的年龄排序即可。
  这里用到map,建立名字到编号的映射,从而获取一个人在树中的节点编号。

#include <iostream>
#include <stdio.h>
#include <map>
#include <string>
#include <string.h>
#include <vector>
#include <algorithm> using namespace std;
map<string,int> person;
int n; //即题目中的X值 struct Line{
string fname; //父亲的名字
string cname; //孩子的名字
int fage; //孩子出生时,父亲的年龄
}line[];
struct Node{
string name; //名字
int age; //年龄
int fage; //出生时父亲的年龄,则该节点的年龄=父亲的年龄-fage
vector<int> son; //存储孩子的编号
bool operator<(const Node tmp)const{
if(age==tmp.age)
return name<tmp.name;
else
return age>tmp.age;
}
}node[]; //遍历,求节点的年龄
void dfs(int u){
for(int i=;i<node[u].son.size();i++){
int v=node[u].son[i];
node[v].age=node[u].age-node[v].fage;
dfs(v);
}
}
int main()
{
int t;
scanf("%d",&t);
for(int q=;q<=t;q++){
printf("DATASET %d\n",q);
person.clear();
for(int i=;i<;i++)
node[i].son.clear(); int idx=;
person["Ted"]=++idx;
scanf("%d",&n);
for(int i=;i<=n;i++){
cin>>line[i].fname>>line[i].cname>>line[i].fage;
//如果不存在该字符串的映射,即映射为0,则建立映射关系
if(!person[line[i].fname])
person[line[i].fname]=++idx;
if(!person[line[i].cname]){
person[line[i].cname]=++idx;
}
}
//根节点
node[].name="Ted";
node[].age=;
int u,v;
for(int i=;i<=n;i++){
u=person[line[i].fname];
v=person[line[i].cname];
node[u].name=line[i].fname;
node[u].son.push_back(v);
node[v].name=line[i].cname;
node[v].fage=line[i].fage;
} dfs();
sort(node+,node+idx+);
for(int i=;i<=idx;i++){
if(node[i].name!="Ted")
cout<<node[i].name<<" "<<node[i].age<<endl;
}
}
return ;
}

POJ 2021 Relative Relatives(map+树的遍历)的更多相关文章

  1. POJ 2021 Relative Relatives

    Relative Relatives Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3339   Accepted: 146 ...

  2. poj 2021 Relative Relatives(暴力)

    题目链接:http://poj.org/problem?id=2021 思路分析:由于数据较小,采用O(N^2)的暴力算法,算出所有后代的年龄,再排序输出. 代码分析: #include <io ...

  3. POJ 2001 Shortest Prefixes(字典树)

    题目地址:POJ 2001 考察的字典树,利用的是建树时将每个点仅仅要走过就累加.最后从根节点開始遍历,当遍历到仅仅有1次走过的时候,就说明这个地方是最短的独立前缀.然后记录下长度,输出就可以. 代码 ...

  4. pat 团体天梯赛 L2-006. 树的遍历

    L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...

  5. 天梯赛L2-006. 树的遍历L3-010. 是否完全二叉搜索树

    L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...

  6. L2-006. 树的遍历(不建树)

    L2-006. 树的遍历   给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树中结点 ...

  7. Map三种遍历方式

    Map三种遍历方式 package decorator; import java.util.Collection; import java.util.HashMap; import java.util ...

  8. 数据结构--树(遍历,红黑,B树)

    平时接触树还比较少,写一篇博文来积累一下树的相关知识. 很早之前在数据结构里面学的树的遍历. 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点->右子树 后序遍 ...

  9. YTU 3023: 树的遍历

    原文链接:https://www.dreamwings.cn/ytu3023/2617.html 3023: 树的遍历 时间限制: 1 Sec  内存限制: 128 MB 提交: 3  解决: 2 题 ...

随机推荐

  1. EOF 与 getchar()

    1.EOF EOF是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file),也可以是标准输入(stdin) ...

  2. [转]C++编写Config类读取配置文件

    //Config.h #pragma once #include <string> #include <map> #include <iostream> #incl ...

  3. (1)c语言学习总结之从关键字到循环结构

    一.关键字和标示符 1.关键字:c规定的有特殊含义的单词(也就是系统起的名字),全部是小写,有32个; 由关键字引出数据类型和流程类型 1.分类: (1)数据类型:整型用int标示,字符型用char表 ...

  4. 博客导出工具(C++实现,支持sina,csdn,自定义列表)

    操作系统:windowAll 编程工具:visual studio 2013 编程语言:VC++ 最近博文更新的较频繁,为了防止账号异常引起csdn博文丢失,所以花了点时间做了个小工具来导出博文,用做 ...

  5. StyleCop学习笔记——默认的规则

    在StyleCop中有一些官方自己写好的检测规则下面就是英文的解释 文档规则 1.SA1600:ElementsMustBeDocumented元素必须添加注释 2.SA1601: PartialEl ...

  6. Oracle11g install Bbed

    1.sbbdpt.o ssbbded.o bbedus.msb文件链接地址: http://pan.baidu.com/s/1c0tHMCS 2.DB:  Oracle Database 11g En ...

  7. oracle自定义job名字,job调度

    一.调试创建 begin -- create_schedule dbms_scheduler.create_schedule(schedule_name => 's_change_send_da ...

  8. 使用Apriori算法和FP-growth算法进行关联分析

    系列文章:<机器学习实战>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章 ...

  9. Go中简单的文件读写

    Go中的ioutil包可以方便的实现文件读写.代码: package main import ( "fmt" "io/ioutil" ) func main() ...

  10. Go实现线程池

    本文通过代码讲解如何实现一个线程池.代码(来自https://gobyexample.com/)及注释如下: package main import "fmt" import &q ...