[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,分别表示树的结点个数.询 ...
随机推荐
- Vim配置文件备忘
"我的配置 """""""""其他"""""&qu ...
- array_diff的参数前后循序的区别
//如果两个参数之间有区别.array_diff会返回第二个参数的差值 $oldData = array(0=>'德国',1=>'deguo'); $newData = array(0=& ...
- 24 个你应该了解的 PHP 库
24 个你应该了解的 PHP 库 2015-09-08 分类:WEB开发.编程开发.首页精华暂无人评论 来源:伯乐在线 分享到:更多3 二十万年薪PHP工程师培养计划 成为被疯抢的And ...
- 【转】基于 CoreText 实现的高性能 UITableView
引起UITableView卡顿比较常见的原因有cell的层级过多.cell中有触发离屏渲染的代码(譬如:cornerRadius.maskToBounds 同时使用).像素是否对齐.是否使用UITab ...
- centos7下快速安装mysql
CentOS 7的yum源中貌似没有正常安装MySQL时的mysql-sever文件,需要去官网上下载 # wget http://dev.mysql.com/get/mysql-community- ...
- Velocity模板引擎语法
Velocity 模板引擎介绍 Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java ...
- C语言 str2bin 和 bin2str 实现
需求介绍 在编码或者调试过程中经常需要进行 字节码转换为 十六进制的字符串, 或者将 十六进制字符串 转换为 字节码的需求. 即: 字节码 (内存中存储的 01 串): 11111111 &l ...
- 字节流和字符流(PrintStream类和PrintWiter类)
要想输入和输出各种数据类型,通常要打印输入流PrintStream和PrintWriter.其中,PrintStream操作的是字节,PrintWriter操作的是字符. 1:PrintStream类 ...
- Oracle EBS R12 电子技术参考手册 - eTRM (电子文档)
http://etrm.oracle.com/pls/etrm/etrm_search.search
- Leetcode: Nested List Weight Sum II
Given a nested list of integers, return the sum of all integers in the list weighted by their depth. ...