hihocoder1067 最近公共祖先·二
思路:
使用tarjan算法,这是一种离线算法。
实现:
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
const int MAXN = ;
vector<int> G[MAXN], qry[MAXN];
int par[MAXN], vis[MAXN];
void init(int n)
{
for (int i = ; i <= n; i++) par[i] = i;
}
int find(int x)
{
if (par[x] == x) return par[x];
return par[x] = find(par[x]);
}
int uni(int x, int y)
{
x = find(x); y = find(y);
if (x == y) return x;
par[x] = y; return y;
}
void dfs(int u, int f, map<pii, int> & ans)
{
vis[u] = ;
for (auto it: qry[u])
{
int tmp = vis[it];
if (!tmp) continue;
if (tmp == )
ans[pii(u, it)] = it;
else if (tmp == )
ans[pii(u, it)] = find(it);
}
for (int i = ; i < G[u].size(); i++)
if (!vis[G[u][i]]) dfs(G[u][i], u, ans);
vis[u] = ;
uni(u, f);
}
int main()
{
int n, q;
cin >> n;
string x, y;
map<string, int> mp;
map<int, string> mp2;
int id = , root = -;
for (int i = ; i < n; i++)
{
cin >> x >> y;
int pid = -, sid = -;
if (!mp.count(x)) { mp[x] = pid = id; mp2[id] = x; id++; }
else pid = mp[x];
if (!mp.count(y)) { mp[y] = sid = id; mp2[id] = y; id++; }
else sid = mp[y];
if (i == ) root = pid;
G[pid].push_back(sid);
}
cin >> q;
vector<pii> v;
for (int i = ; i < q; i++)
{
cin >> x >> y;
int xid = mp[x], yid = mp[y];
qry[xid].push_back(yid);
qry[yid].push_back(xid);
v.push_back(pii(xid, yid));
}
init(n);
map<pii, int> ans;
dfs(root, , ans);
for (auto it: v)
{
int xid = it.first, yid = it.second;
pii a(xid, yid), b(yid, xid);
if (ans.count(a)) cout << mp2[ans[a]] << endl;
else cout << mp2[ans[b]] << endl;
}
return ;
}
hihocoder1067 最近公共祖先·二的更多相关文章
- hihocoder1067 最近公共祖先·二(tarjin算法)(并查集)
#1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站 ...
- hihoCoder #1067 : 最近公共祖先·二 [ 离线LCA tarjan ]
传送门: #1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站 ...
- Hihocoder #1067 : 最近公共祖先·二
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中 ...
- 【HIHOCODER 1067】最近公共祖先·二(LCA)
描述 上上回说到,小Hi和小Ho用非常拙劣--或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中辈分最低的一个是谁.远在美国的他们利用了一些奇妙的技术获得了国内许多人的 ...
- 学习LCA( 最近公共祖先·二)
http://poj.org/problem?id=1986 离线找u,v之间的最小距离(理解推荐) #include<iostream> #include<cstring> ...
- 【hihoCoder第十五周】最近公共祖先·二
老实说我没有读题,看见标题直接就写了,毕竟hiho上面都是裸的算法演练. 大概看了下输入输出,套着bin神的模板,做了个正反map映射,但是怎么都得不了满分.等这周结束后,找高人询问下trick. 若 ...
- hihoCoder week15 最近公共祖先·二
tarjan求lca 就是dfs序中用并查集维护下,当访问到询问的第二个点u的时候 lca就是第一点的find(fa[v]) fa[v] = u; // 当v为u的儿子 且 v已经dfs完毕 #i ...
- HihoCoder 1067 最近公共祖先(ST离线算法)
最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个 ...
- [Swift]LeetCode235. 二叉搜索树的最近公共祖先 | Lowest Common Ancestor of a Binary Search Tree
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...
随机推荐
- 秒懂单链表及其反转(reverse)
什么是链表,这种数据结构是由一组Node组成的,这群Node一起表示了一个序列.链表是最普通,最简单的数据结构(物理地址不连续),它是实现其他数据结构如stack, queue等的基础. 链表比起数组 ...
- Linux 进程等待队列【转】
本文转载自:http://blog.csdn.net/dlutbrucezhang/article/details/9212067 Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制 ...
- HDU1241 Oil Deposits —— DFS求连通块
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241 Oil Deposits Time Limit: 2000/1000 MS (Java/Othe ...
- 一步一步学Silverlight 2系列(15):数据与通信之ASMX
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- Python安装pip3常见问题
安装pip3 1.安装 zlib组件: 安装完成后,执行命令 python3 -m pip install redis,报错: RuntimeError: Compression requires t ...
- Java常用数据结构和算法
二叉树: 1.每个结点不能多于两个子树: 2.一颗平衡二叉树的深度要比及结点个数N小得多. 二叉查找树: 1.结点x的所有左子树的值小于x,所有右子树的值大于x: AVL树: 1.一种带有平衡条件的二 ...
- web_html-day1
概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...
- DELL R730服务器配置RAID及安装服务器系统 以及域的控制
https://wenku.baidu.com/view/ad45d85a9ec3d5bbfd0a74d9.html
- Vue 依赖收集原理分析
此文已由作者吴维伟授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Vue实例在初始化时,可以接受以下几类数据: 模板 初始化数据 传递给组件的属性值 computed wat ...
- Swift3.0 字符串(string)
string常用的一些操作方式 //字符串 //1.初始化字符串 //1.1通过字面量赋值的方式初始化字符串 let tempStrig = "this is temp string&quo ...