[HIHO1062] 最近公共祖先·一(lca, 并查集, 二分, 神trick)
题目链接:http://hihocoder.com/problemset/problem/1062
题意裸,有个trick,导致我当年做的时候一直在WA...
那就是出现这种没有出现在关系中,但是依然可以知道他们关系的输入样例: LinDaiyu LinDaiyu
应该输出自己。
#include <bits/stdc++.h>
using namespace std; const int maxn = ;
int n, m, q;
map<string, int> id;
string di[maxn];
vector<int> G[maxn];
int depth[maxn], fa[maxn], in[maxn];
char a[maxn], b[maxn];
int pre[maxn]; int find(int x) {
return x == pre[x] ? x : pre[x] = find(pre[x]);
} void unite(int x, int y) {
x = find(x);
y = find(y);
if(x != y) pre[x] = y;
} void dfs(int u, int p, int d) {
depth[u] = d;
fa[u] = p;
for(int i = ; i < G[u].size(); i++) {
int &v = G[u][i];
if(v == u || v == p) continue;
dfs(v, u, d+);
}
} int query(int u, int v) {
if(find(u) != find(v)) return -;
if(depth[u] < depth[v]) swap(u, v);
while(depth[u] > depth[v]) u = fa[u];
while(u != v) {
u = fa[u];
v = fa[v];
}
return u;
} int main() {
// freopen("in", "r", stdin);
while(~scanf("%d", &n)) {
id.clear(); m = ;
memset(depth, , sizeof(depth));
memset(in, , sizeof(in));
for(int i = ; i < maxn; i++) {
pre[i] = i;
G[i].clear();
}
for(int i = ; i < n; i++) {
scanf("%s %s", a, b);
if(id.find(a) == id.end()) {
id[a] = ++m;
di[m] = a;
}
if(id.find(b) == id.end()) {
id[b] = ++m;
di[m] = b;
}
G[id[a]].push_back(id[b]);
unite(id[a], id[b]);
in[id[b]]++;
}
for(int i = ; i <= m; i++) {
if(!in[i]) {
dfs(i, -, );
}
}
scanf("%d", &q);
while(q--) {
scanf("%s %s", a, b);
if(strcmp(a, b) == ) {
puts(a);
continue;
}
if(id.find(a) == id.end() || id.find(b) == id.end()) {
puts("-1");
continue;
}
int ret = query(id[a], id[b]);
if(ret == -) puts("-1");
else puts(di[ret].c_str());
}
}
return ;
}
[HIHO1062] 最近公共祖先·一(lca, 并查集, 二分, 神trick)的更多相关文章
- [HDOJ2586]How far away?(最近公共祖先, 离线tarjan, 并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 这题以前做过…现在用tarjan搞一发…竟然比以前暴力过的慢………… 由于是离线算法,需要Que ...
- 最近公共祖先问题 LCA
2018-03-10 18:04:55 在图论和计算机科学中,最近公共祖先,LCA(Lowest Common Ancestor)是指在一个树或者有向无环图中同时拥有v和w作为后代的最深的节点. 计算 ...
- 最近公共祖先(LCA)---tarjan算法
LCA(最近公共祖先).....可惜我只会用tarjan去做 真心感觉tarjan算法要比倍增算法要好理解的多,可能是我脑子笨吧略略略 最近公共祖先概念:在一棵无环的树上寻找两个点在这棵树上深度最大的 ...
- 最近公共祖先(LCA)学习笔记 | P3379 【模板】最近公共祖先(LCA)题解
研究了LCA,写篇笔记记录一下. 讲解使用例题 P3379 [模板]最近公共祖先(LCA). 什么是LCA 最近公共祖先简称 LCA(Lowest Common Ancestor).两个节点的最近公共 ...
- 洛谷P3379 【模板】最近公共祖先(LCA)
P3379 [模板]最近公共祖先(LCA) 152通过 532提交 题目提供者HansBug 标签 难度普及+/提高 提交 讨论 题解 最新讨论 为什么还是超时.... 倍增怎么70!!题解好像有 ...
- 最近公共祖先:LCA及其用倍增实现 +POJ1986
Q:为什么我在有些地方看到的是最小公共祖先? A:最小公共祖先是LCA(Least Common Ancestor)的英文直译,最小公共祖先与最近公共祖先只是叫法不同. Q:什么是最近公共祖先(LCA ...
- 洛谷 3379 最近公共祖先(LCA 倍增)
洛谷 3379 最近公共祖先(LCA 倍增) 题意分析 裸的板子题,但是注意这题n上限50w,我用的边表,所以要开到100w才能过,一开始re了两发,发现这个问题了. 代码总览 #include &l ...
- P3379 【模板】最近公共祖先(LCA)
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
- 洛谷P3379 【模板】最近公共祖先(LCA)(dfs序+倍增)
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
随机推荐
- IOS第15天(2,事件处理hitTest练习)
***hitTest 获取最合适的点 @implementation HMGreenView - (void)touchesBegan:(NSSet *)touches withEvent:(UIEv ...
- buddy算法
buddy算法是用来做内存管理的经典算法,目的是为了解决内存的外碎片.避免外碎片的方法有两种: 1,利用分页单元把一组非连续的空闲页框映射到非连续的线性地址区间. 2,开发适当的技术来记录现存的空闲连 ...
- Sharepoint 2013 回收站知识整理
回收站机制可有利于防止内容的永久删除与误删除. 一.SharePoint 2013 回收站包括两种:第一回收站(End user Recycle Bin items)与 第二回收站(Deleted f ...
- 20145224&20145238《信息安全系统设计基础》实验四
20145224陈颢文20145238荆玉茗 <信息安全系统设计基础>第四次实验报告 课程:信息安全系统设计基础 班级: 1452 姓名:荆玉茗 陈颢文 学号:20145238 20145 ...
- 1920.154s 0.309s 30817
MyISAM HASH restart-buffer ; ; ; SELECT * FROM grab_sales_rank_month; ; 受影响的行: 时间: .002s [SQL] ; 受影 ...
- 程序最多能new多少内存(2G内存里要放程序的5大区,HeapAlloc比new要快多了,而且超过2G的时候会告诉你)
根据<Windows核心编程>得知:X86操作系统提供每个程序最多只有4G的虚拟内存,其中2G虚拟内存提供给系统用(具体用来干什么还待考察),还有2G的内存留给用户使用.那这2G内存能拿来 ...
- Hibernate n+1问题
转自: http://www.blogjava.net/RoyPayne/archive/2012/01/30/369017.htmlhttp://msi110.iteye.com/blog/7101 ...
- Sql Server批量删除指定表
--批量删除以test的表开头的表 declare @name varchar(50) while(exists(select * from sysobjects where name like te ...
- jquery例子
jquery <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- objective-c第六章课后练习5
题5:用于翻转从终端输入数的各个位.然后修改这个程序,以便正确的输入负数. code: ,result_5 = ; NSLog(@"input num_5:"); scanf(&q ...