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 ...
随机推荐
- manacher求最长回文子串算法模板
#include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> ...
- 关于eclipse的resource文件没有发布到tomcat上的解决方案
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/luman1991/article/details/53457302
- File.Copy的时候Could not find a part of the path
https://developercommunity.visualstudio.com/content/problem/378265/filecopy-did-not-throw-the-correc ...
- I.MX6 Parallel RGB LCD Datasheet描述
/******************************************************************** * I.MX6 Parallel RGB LCD Datas ...
- NSError分析
在iOS开发中,NSError的使用非常常见,使用也比较简单,也正因为简单,所以对这一部分知识不甚注重.但是近期在做app底层网络封装时发现了一些问题.我使用的网络框架是AFNetworking,AF ...
- TypeError: can't convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.
报错原因:numpy不能读取CUDA tensor 需要将它转化为 CPU tensor. 所以如果想把CUDA tensor格式的数据改成numpy时,需要先将其转换成cpu float-tenso ...
- 洛谷P1247取火柴游戏
题目:https://www.luogu.org/problemnew/show/P1247 可以知道必败局面为n[1]^n[2]^...^n[k]=x=0: 而若x不等于0,则一定可以取一次使其变为 ...
- 出现"Unable to instantiate Action,xxxxx, defined for 'login' in namespace '/' xxxxx 解决办法
转自:https://blog.csdn.net/heroful/article/details/17261169 问题原因: 在MyEclipse 利用SSH框架写程序,运行时出现 " U ...
- delphi 2010 启动卡死,过一段时间后出现“displayNotification:堆栈溢出 怎么解决?
解决方法:打开IE,在Internet选项中,删除历史记录.
- Lua变量
Lua 变量 变量在使用前,必须在代码中进行声明,即创建该变量. 编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值. Lua 变量有三种类型:全局变量.局部变量.表中的域. ...