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 题 ...
随机推荐
- Mybatis typeAliases别名
<typeAliases> <typeAlias type="com.green.phonemanage.model.CellPhone" alias=" ...
- hdu 1890 Robotic Sort
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 如下: #include<cstdio> #include<cstdlib&g ...
- iOS 中使用md5加密
#import <CommonCrypto/CommonDigest.h> @implementation MD5Util +(NSString *)encode:(NSString *) ...
- MVC 初始 Log4net (一)
以前没有使用过Log4net 插件来记录日志文件,今天研究了一下,算是有点小眉目了,只是简单的使用一下:来写一篇博客自己记录一下,希望大神们多多包涵,小伙伴多多给提些建议,相互学习,我也是初始阶段,有 ...
- SQL 执行顺序
SQL 是一种声明式语言,与其他语言相比它的最大特点是执行顺序-并非按照语法顺序来执行.因此很多程序猿看到SQL就头疼,我之前也是这样,后来看到一篇文章后豁然开朗-地址. 理解了SQL的执行顺序无疑对 ...
- Winform之ListView
ListView表示 Windows 列表视图控件,该控件显示可用四种不同视图之一显示的项集合.
- Web中Listener的创建
使用Listener只需要两个步骤: 定义Listener实现类. 通过Annotation或在web.xml文件中配置Listener 实现Listener类 监听不同Web事件的监听器不相同,常用 ...
- Oracle EBS中查询Profile的各种SQL【转载】
1.List E-Business Suite Profile Option Values For All Levels SELECT p.profile_option_name SHORT_NAME ...
- heap size eclipse 堆内存
可以根据eclipse 或 myeclipse heapstats 使用情况调整堆内存大小,heap size 设置,-vmargs-Xms256-Xmx1024 ,其中Xms表示初始值,Xmx表示最 ...
- 玩耍Hibernate系列(一)补充--基础知识
基本概述: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得java程序员可以随心所欲的使用对象编程思维来操纵数据库,Hibernate可以应用在任何 ...