题意:
  今天是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. Mybatis typeAliases别名

    <typeAliases> <typeAlias type="com.green.phonemanage.model.CellPhone" alias=" ...

  2. hdu 1890 Robotic Sort

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 如下: #include<cstdio> #include<cstdlib&g ...

  3. iOS 中使用md5加密

    #import <CommonCrypto/CommonDigest.h> @implementation MD5Util +(NSString *)encode:(NSString *) ...

  4. MVC 初始 Log4net (一)

    以前没有使用过Log4net 插件来记录日志文件,今天研究了一下,算是有点小眉目了,只是简单的使用一下:来写一篇博客自己记录一下,希望大神们多多包涵,小伙伴多多给提些建议,相互学习,我也是初始阶段,有 ...

  5. SQL 执行顺序

    SQL 是一种声明式语言,与其他语言相比它的最大特点是执行顺序-并非按照语法顺序来执行.因此很多程序猿看到SQL就头疼,我之前也是这样,后来看到一篇文章后豁然开朗-地址. 理解了SQL的执行顺序无疑对 ...

  6. Winform之ListView

    ListView表示 Windows 列表视图控件,该控件显示可用四种不同视图之一显示的项集合.

  7. Web中Listener的创建

    使用Listener只需要两个步骤: 定义Listener实现类. 通过Annotation或在web.xml文件中配置Listener 实现Listener类 监听不同Web事件的监听器不相同,常用 ...

  8. Oracle EBS中查询Profile的各种SQL【转载】

    1.List E-Business Suite Profile Option Values For All Levels SELECT p.profile_option_name SHORT_NAME ...

  9. heap size eclipse 堆内存

    可以根据eclipse 或 myeclipse heapstats 使用情况调整堆内存大小,heap size 设置,-vmargs-Xms256-Xmx1024 ,其中Xms表示初始值,Xmx表示最 ...

  10. 玩耍Hibernate系列(一)补充--基础知识

    基本概述: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得java程序员可以随心所欲的使用对象编程思维来操纵数据库,Hibernate可以应用在任何 ...