写这篇博客的原因是缅怀一下这个题WA了两个小时的时光~~~~

原命题链接:
hihoCoder;
Vjudge

1062 : 最近公共祖先·一

>

Time Limit:10000ms
Case Time Limit:1000ms
Memory Limit:256MB
描述

小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢?

“为什么呢?”小Hi如是问道,在他的观察中小Ho已经沉迷这个网站一周之久了,甚至连他心爱的树玩具都弃置一边。

“嘿嘿,小Hi,你快过来看!”小Ho招呼道。

“你看,在这个对话框里输入我的名字,在另一个对话框里,输入你的名字,再点这个查询按钮,就可以查出来……什么!我们居然有同一个祖祖祖祖祖爷爷?”

“诶,真是诶……这个网站有点厉害啊。”小Hi不由感叹道。

“是啊,这是什么算法啊,这么厉害!”小Ho也附和道。

“别2,我说的是他能弄到这些数据很厉害,而人类的繁殖树这种层数比较浅的树对这类算法的要求可是简单的不得了,你都能写出来呢!”小Hi道。

“啊?我也能写出来?可是……该从哪开始呢?”小Ho困惑了。

小Ho要面临的问题是这样的,假设现在他知道了N个人的信息——他们的父亲是谁,他>需要对于小Hi的每一次提问——两个人的名字,告诉小Hi这两个人的是否存在同一个祖先,如果存在,那么他们的所有共同祖先中辈分最低的一个是谁?

提示:不着急,慢慢来,另外我有一个问题:挖掘机技术哪家强?!

输入

每个测试点(输入文件)有且仅有一组测试数据。

每组测试数据的第1行为一个整数N,意义如前文所述。

每组测试数据的第2~N+1行,每行分别描述一对父子关系,其中第i+1行为两个由大小写字母组成的字符串Father_i, Son_i,分别表示父亲的名字和儿子的名字。

每组测试数据的第N+2行为一个整数M,表示小Hi总共询问的次数。

每组测试数据的第N+3~N+M+2行,每行分别描述一个询问,其中第N+i+2行为两个由大小写字母组成的字符串Name1_i, Name2_i,分别表示小Hi询问中的两个名字。

对于100%的数据,满足N<=10^2,M<=10^2, 且数据中所有涉及的人物中不存在两个名字相同的人(即姓名唯一的确定了一个人)。

输出

对于每组测试数据,对于每个小Hi的询问,输出一行,表示查询的结果:如果根据已知信息,可以判定询问中的两个人存在共同的祖先,则输出他们的所有共同祖先中辈分最低的一个人的名字,否则输出-1。

Sample Input
11
JiaYan JiaDaihua
JiaDaihua JiaFu
JiaDaihua JiaJing
JiaJing JiaZhen
JiaZhen JiaRong
JiaYuan JiaDaishan
JiaDaishan JiaShe
JiaDaishan JiaZheng
JiaShe JiaLian
JiaZheng JiaZhu
JiaZheng JiaBaoyu
3
JiaBaoyu JiaLian
JiaBaoyu JiaZheng
JiaBaoyu LinDaiyu
Sample Output
JiaDaishan
JiaZheng
-1

.

题意很明确,给我一种像是并查集的感觉;

我的做法是,用map保存每一个人名的一个id,类似于身份证的那种唯一识别码,然后根据这个码就可以找到那个人,然后有一个pre数组,表示下标这个人的上一辈是他储存的数值。

然后查找的时候,我将每一个人的分支从他自己开始,一直到根节点(始祖)都保存下来,然后从头去对比,只要是两个数组中都有的数字,便是公共祖先,又因为保存的时候是从自己开始向上保存,所以最先找到的,都是最近的公共祖先。

然后呢,还是WA了好久。。。。因为

有一个地方没有想到,思路还是太窄

如果查找的时候输入的人名尚未在族谱中保存,则不去做匹配查找。
但是,如果人名相同,但不在族谱中,还是要输出姓名!!!

宝宝太可怜了!

#include <bits/stdc++.h>using namespace std;
const int maxn = 1e5 + 100;map<string,int> m;
int pre[maxn<<2];void Union(int f,int s){pre[s] = f;
}int Query(int f,int s){vector<int> a,b;int sf = f;while(sf != pre[sf]){a.push_back(sf);sf = pre[sf];}a.push_back(pre[sf]);int ss = s;while(ss != pre[ss]){b.push_back(ss);ss = pre[ss];}b.push_back(pre[ss]);unsigned int la = a.size();for(unsigned int i = 0;i < la; i++){if(find(b.begin(), b.end(), a[i]) != b.end()){return *find(b.begin(), b.end(), a[i]);}}return -1;
}int main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int N;cin >> N;for(int i = 0;i <= N; i++){pre[i] = i;}m.clear();int id = 0;for(int i = 0;i < N; i++){string fs, ss;cin >> fs >> ss;if(!m.count(fs)) m[fs] = id++;if(!m.count(ss)) m[ss] = id++;Union(m[fs], m[ss]);}map<string, int> :: iterator w = m.begin();int Q;cin >> Q;for(int i = 0;i < Q; i++){string a, b;cin >> a >> b;if(a == b){cout << a << endl;continue;}else if(!m.count(a) || !m.count(b)){cout << -1 << endl;continue;}int ans = Query(m[a], m[b]);if(ans != -1){map<string, int> :: iterator p = m.begin();while(p != m.end()){if(p->second  == ans){break;}p++;}cout << p->first << endl;}elsecout << -1 << endl;}return 0;
}

hihoCoder #1062 : 最近公共祖先·一相关推荐

  1. hihocoder #1069 : 最近公共祖先·三(ST求LCA)

    题目:http://hihocoder.com/problemset/problem/1069?sid=1175440 思路:就是map存储求LCA,然而开始模板弄错了,wa了n次 代码: #incl ...

  2. hihoCoder week17 最近公共祖先·三 lca st表

    记录dfs序列,dfn[tot] 记录第tot次访问的节点 然后查两点在dfs序中出现的第一次 id[u] id[v] 然后  找 dep[k] = min( dep[i] ) {i 属于 [id[u ...

  3. LCA倍增法 求树的最近公共祖先(模板)

    LCA倍增法 求树的最近公共祖先 查询树上任意两个节点之间的路径信息,实际上就是找这两个节点的LCA,因为唯一路径就是这两个节点分别到LCA会合,所以关键问题就是求LCA,需要的路径信息可在找LCA过 ...

  4. 有一个1亿结点的树,已知两个结点, 求它们的最低公共祖先!

    对该问题,分为如下几种情形讨论: 情形一: 假如该树为二叉树,并且是二叉搜索树, 依据二叉搜索树是排过序的, 我们只需要从树的根结点开始,逐级往下,和两个输入的结点进行比较. 如果当前结点的值比两个结 ...

  5. 二叉树:最近的公共祖先 Lowest Common Ancestor of a Binary Tree

    已知二叉树,求二叉树中给定的两个节点的最近公共祖先. 最近公共祖先: 两节点v与w的最近公共祖先u,满足在树上最低(离根最 远),且v,w两个节点都是u的子孙. 如上二叉树,6和8号节点的公共祖先有4 ...

  6. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  7. LeetCode实战:二叉树的最近公共祖先

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a bin ...

  8. LeetCode实战:二叉搜索树的最近公共祖先

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a bin ...

  9. 0x63.图论 - 树的直径与最近公共祖先

    目录 一.树的直径(Diameter) 1.树形DP求树的直径 2.两次BFS/DFS求树的直径 1.POJ 1985.Cow Marathon(DFS求树的直径模板题) 2.AcWing 350. ...

最新文章

  1. 安装Sublime Text 支持Go插件
  2. mysql+挂马代码_转载:挂马代码大全
  3. 在Spring中使用DButils
  4. 理科生浪漫起来,谁都顶不住!
  5. leetcode - 53. 最大子序和 152. 乘积最大子序列 - 两个算法之间的联系和区别
  6. can是什么时候处于显性_CAN总线边沿时间标准是什么?
  7. python下载大文件mp4_python 实现视频流下载保存MP4的方法
  8. php数据库之mysql (where 、order By 、 Update)
  9. 《自卑与超越》读书笔记
  10. matebook14支持触摸屏吗_新款华为MateBook 14 2020款评测——触控屏来!
  11. 第三讲 cs224n系列之skip-pram优化 Global Vector by Manning 词向量评价
  12. OpenFileDialog/SaveFileDialog 中 Filter用法?
  13. WZ安卓面试宝典App
  14. 第一行代码android网课,使用Mongodb实现打卡签到系统的实例代码
  15. 本土回忆! 即使你走的再远,也不能忘了让你生长的老家文化~
  16. java 解决企查查非法操作验证问题 爬取企查查企业相关数据 最新实践可用 java 代码
  17. Leaflet 调用百度瓦片地图服务
  18. 百度网盘网页版倍速播放
  19. 山东大学软件学院 - 面向对象开发技术 - 期末复习知识点总结
  20. 翻翻git之---不靠画全靠“演”,好看的自定义TextView translucent-android

热门文章

  1. 工业废水的种类及处理工艺选择
  2. js变量提升hoisting
  3. STC8系列单片机硬件I2C使用教程(一)
  4. (脑肿瘤分割笔记:四十三)用于脑胶质瘤分割的上下文感知网络
  5. 解决rabbitmq add_user 报错
  6. Stata新命令:konfound-因果推断的稳健性检验
  7. 右值引用带来的效率提升(C++11)
  8. 树模型系列之集成学习(Bagging、Boosting、Stacking)
  9. 详细的obs操作教程(windows/mac)图解
  10. iOS百度地图 Demo