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 ...
随机推荐
- Jmeter性能测试-GC相关
1.GC相关 HotSpot虚拟机将其物理上划分为两个–新生代(young generation)和老年代(old generation).新生代(Young generation): 绝大多数最新被 ...
- PHP的date 函数
<!DOCTYPE html> <html> <body> <?php echo "今天是 " . date("Y/m/d&qu ...
- POJ3414 Pots —— BFS + 模拟
题目链接:http://poj.org/problem?id=3414 Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
- java 读写Oracle Blob字段
许久没有分享代码了,把这段时间写的一个Java操作Blob字段,有日子没写Java了,就当作笔记记录一下.1. [代码][Java]代码 跳至 [1] [全屏预览]package com.wa ...
- codeforces 437A. The Child and Homework 解题报告
题目链接:http://codeforces.com/problemset/problem/437/A 题目意思:给出四个选项A.B.C.D选项的内容描述,要求选出符合以下条件的一项. (1)如果某个 ...
- highchart学习网址
http://www.highcharts.me/api/index.html
- 一步一步学Silverlight 2系列(20):如何在Silverlight中与HTML DOM交互(下)
述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- cassandra解析-log写
db/Keyspace.java 中的 apply 函数 中的 commitLogPosition = CommitLog.instance.add(mutation); 这一句确认是写log的代码. ...
- 书写优雅的shell脚本(一)- if语句
使用unix/linux的程序人员几乎都写过shell脚本,但这其中很多人都是为了完成功能而在网上找代码段,这样写出来的shell脚本在功能方面当然是没有什么问题,但是这样的方式不能写出优雅的shel ...
- 并不对劲的p4449于神之怒加强版
题目大意 给定\(t,k(t\leq2000,k\leq5*10^6)\) \(t\)组询问,每组给出\(n,m(n,m\leq5*10^6)\)求$\sum_{i=1}^n \sum_{j=1}^m ...