POJ 2021 Relative Relatives(map+树的遍历)
题意:
今天是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+树的遍历)的更多相关文章
- POJ 2021 Relative Relatives
Relative Relatives Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3339 Accepted: 146 ...
- poj 2021 Relative Relatives(暴力)
题目链接:http://poj.org/problem?id=2021 思路分析:由于数据较小,采用O(N^2)的暴力算法,算出所有后代的年龄,再排序输出. 代码分析: #include <io ...
- POJ 2001 Shortest Prefixes(字典树)
题目地址:POJ 2001 考察的字典树,利用的是建树时将每个点仅仅要走过就累加.最后从根节点開始遍历,当遍历到仅仅有1次走过的时候,就说明这个地方是最短的独立前缀.然后记录下长度,输出就可以. 代码 ...
- pat 团体天梯赛 L2-006. 树的遍历
L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...
- 天梯赛L2-006. 树的遍历L3-010. 是否完全二叉搜索树
L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...
- L2-006. 树的遍历(不建树)
L2-006. 树的遍历 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树中结点 ...
- Map三种遍历方式
Map三种遍历方式 package decorator; import java.util.Collection; import java.util.HashMap; import java.util ...
- 数据结构--树(遍历,红黑,B树)
平时接触树还比较少,写一篇博文来积累一下树的相关知识. 很早之前在数据结构里面学的树的遍历. 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点->右子树 后序遍 ...
- YTU 3023: 树的遍历
原文链接:https://www.dreamwings.cn/ytu3023/2617.html 3023: 树的遍历 时间限制: 1 Sec 内存限制: 128 MB 提交: 3 解决: 2 题 ...
随机推荐
- 【原创】StickHeaderListView的简单实现,解决footerView问题
1.前言: 前几天用了GitHub上se.emilsjolander.stickylistheaders这个组件,然后发现这个组件的listview不能添加footerView,加了footer后,滑 ...
- c++编程规范的纲要和记录
这是一本好书, 可以让你认清自己对C++的掌握程度.看完之后,给自己打分,我对C++了解多少? 答案是不足20分.对于我自己是理所当然的问题, 就不提了, 记一些有启发的条目和细节: (*号表示不能完 ...
- Android--启动拍照功能并返回结果
因为没有深入学习拍照这块功能,所以只是简单的调用了一下系统的拍照功能,下面代码: //拍照的方法 private void openTakePhoto(){ /** * 在启动拍照之前最好先判断一下s ...
- MongoDB学习笔记-数据库命令
概念 数据库命令(database command)是一种非常特殊类型的查询.文档的创建.更新.删除及查询都属于数据库命令的范畴,它还包含管理性的任务(比如关闭服务器和克隆数据库).统计数据及执行聚合 ...
- SharePoint 2010 中使用Ztree和EasyUI样式冲突问题
<style type="text/css"> /*解决ztree和SharePoint样式冲突问题*/ .ztree li a { display: inline-b ...
- Linux Centos 6.6搭建SFTP服务器
Linux Centos 6.6搭建SFTP服务器 在Centos 6.6环境使用系统自带的internal-sftp搭建SFTP服务器. 打开命令终端窗口,按以下步骤操作. 0.查看openssh的 ...
- FPGA---ucf文件编写
摘要:本文主要通过一个实例具体介绍ISE中通过编辑UCF文件来对FPGA设计进行约束,主要涉及到的约束包括时钟约束.群组约束.逻辑管脚约束以及物理属性约束. Xilinx FPGA设计约束的分类 Xi ...
- 4.FPGA芯片管脚解释
用户I/O:不用解释了. 配置管脚: MSEL[1:0] 用于选择配置模式,比如AS.PS等. DATA0 FPGA串行数据输入,连接到配置器件的串行数据输出管脚. DCLK FPGA串行时钟输出 ...
- xml之基础了解
1.简介 1>什么XML语言(eXtensible Markup Language) 可扩展标记语言XML是SGML的子集,其目标是允许普通的SGML在Web上以目前HTML的方式被服务.接受和 ...
- 团队项目的NABC(截图软件)
我们小组要开发的软件是基于windows上的截图软件,其NABC如下. 1.need: 首先,截图工具是几乎每个用户都会用到的,不管是在工作中,还是在学习上,其针对的人群从学生到上班族不等, 所以,他 ...