题目大意

给出一棵家谱树,树中的节点都有一个名字,保证每个名字都是唯一的,然后进行若干次查询,找出两个名字的最近公共祖先。

分析

数据量较小,对于每次查询都进行如下操作: 
先找出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;
}

hiho_1062_最近公共祖先的更多相关文章

  1. LCA最近公共祖先 ST+RMQ在线算法

    对于一类题目,是一棵树或者森林,有多次查询,求2点间的距离,可以用LCA来解决.     这一类的问题有2中解决方法.第一种就是tarjan的离线算法,还有一中是基于ST算法的在线算法.复杂度都是O( ...

  2. 【转】最近公共祖先(LCA)

    基本概念 LCA:树上的最近公共祖先,对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. RMQ:区间最小值查询问题.对于长度为n的 ...

  3. 【并查集】【树】最近公共祖先LCA-Tarjan算法

    最近公共祖先LCA 双链BT 如果每个结点都有一个指针指向它的父结点,于是我们可以从任何一个结点出发,得到一个到达树根结点的单向链表.因此这个问题转换为两个单向链表的第一个公共结点(先分别遍历两个链表 ...

  4. 洛谷P3379 【模板】最近公共祖先(LCA)

    P3379 [模板]最近公共祖先(LCA) 152通过 532提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 为什么还是超时.... 倍增怎么70!!题解好像有 ...

  5. Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)【转】【修改】

    一.基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成 ...

  6. 数据结构作业——sights(最短路/最近公共祖先)

    sights Description 美丽的小风姑娘打算去旅游散心,她走进了一座山,发现这座山有 n 个景点,由于山路难修,所以施工队只修了最少条的路,来保证 n 个景点联通,娇弱的小风姑娘不想走那么 ...

  7. [最近公共祖先] POJ 3728 The merchant

    The merchant Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 4556   Accepted: 1576 Desc ...

  8. [最近公共祖先] POJ 1330 Nearest Common Ancestors

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27316   Accept ...

  9. 图论--最近公共祖先问题(LCA)模板

    最近公共祖先问题(LCA)是求一颗树上的某两点距离他们最近的公共祖先节点,由于树的特性,树上两点之间路径是唯一的,所以对于很多处理关于树的路径问题的时候为了得知树两点的间的路径,LCA是几乎最有效的解 ...

随机推荐

  1. php获取当前时间和转换格式

    ## 获取时间和转换格式```//1.time():返回当前时间的Unix时间戳$stimestamp = time();$date = date("Y-m-d h:i:sa",$ ...

  2. ..在lua中运用

    ..连接两个字符串 th> a="hello" th> b="world" th> print(a..b) helloworld th> ...

  3. Android内存Activity泄露:Threads

    Android编程中一个共同的困难就是协调Activity的生命周期和长时间运行的任务(task),并且要避免可能的内存泄露.思考下面Activity的代码,在它启动的时候开启一个线程并循环执行任务. ...

  4. java.util.zip对zip文件解压

    //通过构造方法,来创建一个新的ZIP输入流 ZipInputStream in = new ZipInputStream(new FileInputStream("G:/jquery.ca ...

  5. SpringMVC整合Tiles框架

    SpringMVC整合Tiles框架 Tiles组件 tiles-iconfig.xml Tiles是一个JSP布局框架. Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离 ...

  6. linux修改文件所属用户和组

    使用chown命令可以修改文件或目录所属的用户: 命令:chown 用户 目录或文件名 例如:chown qq /home/qq  (把home目录下的qq目录的拥有者改为qq用户) 使用chgrp命 ...

  7. C#语法基础用法Dictionary排序

    Dictionary排序 1.先看效果图: 2.核心逻辑如下: Dictionary<int, string> list = new Dictionary<int, string&g ...

  8. 重定向redirect与跳转forward区别

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DemoResponse.a ...

  9. BZOJ 3640 JC的小苹果(逆矩阵)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3640 题意:给出一个无向图,从1走到n.开始是血量H,从u到达v时血量减少a[v] ...

  10. Codeforces Round #250 (Div. 2)A(英语学习)

    链接:http://codeforces.com/contest/437/problem/A A. The Child and Homework time limit per test 1 secon ...