hiho_1062_最近公共祖先
2016-05-29 18:56
429 查看
[b]题目大意[/b]
给出一棵家谱树,树中的节点都有一个名字,保证每个名字都是唯一的,然后进行若干次查询,找出两个名字的最近公共祖先。
先找出person1到达根节点的路径path,然后再从person2开始向上,每经过一个节点都查询一下该节点是否在path中出现,如果出现,则为该节点。
给出一棵家谱树,树中的节点都有一个名字,保证每个名字都是唯一的,然后进行若干次查询,找出两个名字的最近公共祖先。
分析
数据量较小,对于每次查询都进行如下操作:先找出person1到达根节点的路径path,然后再从person2开始向上,每经过一个节点都查询一下该节点是否在path中出现,如果出现,则为该节点。
实现
#include<iostream> #include<string.h> #include<stdio.h> #include<unordered_map> #include<unordered_set> #include<string> #include<stack> using namespace std; unordered_set<string> path; //存储从一个节点到根节点的路径 unordered_map<string, string> pre; //存储图的结构,通过 <key, value> key为子节点,value为 父节点 int main(){ int n, m; string father, son, person1, person2; cin >> n; for (int i = 0; i < n; i++){ cin >> father >> son; pre[son] = father; } cin >> m; for (int i = 0; i < m; i++){ cin >> person1 >> person2; path.clear(); //存储从person1 到根节点的路径 while (pre.find(person1) != pre.end()){ path.insert(person1); person1 = pre[person1]; } path.insert(person1); //进行查找 bool find = false; while (pre.find(person2) != pre.end()){ person2 = pre[person2]; if (path.find(person2) != path.end()){ find = true; cout << person2 << endl; break; } } //person2此时为根节点,需要注意(不要忘记查找)! if (!find &&path.find(person2) != path.end()){ cout << person2 << endl; } if (!find) cout << -1 << endl; } return 0; }
相关文章推荐
- document的createDocumentFragment()方法
- JDK 配置
- 给Project中文件设置标签用法
- 【转】 Linux内核spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析
- codeforces 638B—— Making Genome in Berland——————【类似拓扑排序】
- 计算机专业英语-01:Foreword
- JAVA时间日期学习笔记
- Unity目录结构
- Xamarin 技术解析
- PHP环境配置综合篇
- JAVA 输入年份月份打印该月的日历
- Qt——消息对话框的设计
- Entity Framework4.3安装以及错误(基础连接已经关闭:未能为SSL/TLS……)问题解决!
- 第十三周学习进度条
- 《校园封神榜》第二阶段个人工作总结——第六天
- 第二次团队冲刺--3
- 【转】自旋锁spin_lock和raw_spin_lock
- 在ubuntu中安装有道词典
- bzoj 2631(link cut tree)
- 团队作业—第二阶段04