ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer
传送门:https://nanti.jisuanke.com/t/31462
本题是一个树上的问题:结点间路径问题。
给定一个有N×M个结点的网格,并给出结点间建立墙(即拆除边)的代价。花费最小的代价,使得每一对结点之间的路径唯一。给出Q次询问:每次询问一对结点的路径长度。
每一对结点之间存在路径,则图是连通的;路径唯一,则图是无环的。于是拆除边后的图是原图的一棵生成树。为使得拆除的代价尽可能小,这棵生成树应是最大生成树。通过Kruskal算法,可以求解最大生成树。
之后,即是询问树结点对的路径长度。这个问题可以通过LCA算法求解。
设结点u、v的LCA为结点k,即k=LCA(u,v),则dis(u,v)=dep[u]+dep[v]-2*dep[k]。此处通过倍增实现LCA。
参考程序如下:
#include <bits/stdc++.h>
using namespace std; #define MAX_N 300005 priority_queue<pair<int, pair<int, int> > > edge;
vector<int> adj[MAX_N]; //Union Find.
int fa[MAX_N]; void init_dset(int n)
{
for (int i = ; i < n; i++) fa[i] = i;
} int find(int u)
{
if (fa[u] == u) return u;
return fa[u] = find(fa[u]);
} void unite(int u, int v)
{
int fu = find(u), fv = find(v);
if (fu == fv) return;
fa[fu] = fv;
} bool same(int u, int v)
{
return find(u) == find(v);
} //LCA.
int pre[][MAX_N]; //Ancestor Nodes.
int dep[MAX_N]; //Depth of Nodes. void dfs(int u, int p)
{
pre[][u] = p;
for (int v : adj[u]) {
if (v != p) {
dep[v] = dep[u] + ;
dfs(v, u);
}
}
} void init_lca(int n)
{
dfs(, -);
for (int k = ; k < ; k++) {
for (int v = ; v < n; v++) {
if (pre[k][v]) pre[k + ][v] = pre[k][pre[k][v]];
}
}
} int lca(int u, int v)
{
if (dep[u] > dep[v]) swap(u, v);
for (int k = ; k < ; k++) {
if ((dep[v] - dep[u]) & ( << k)) v = pre[k][v];
}
if (u == v) return u;
for (int k = ; k >= ; k--) {
if (pre[k][u] != pre[k][v]) {
u = pre[k][u];
v = pre[k][v];
}
}
return pre[][u];
} int main(void)
{
ios::sync_with_stdio(false);
int n, m;
cin >> n >> m;
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
string s, t;
int a, b;
cin >> s >> a >> t >> b;
if (s[] == 'D') {
int u = i * m + j;
int v = (i + ) * m + j;
edge.push(make_pair(a, make_pair(u, v)));
}
if (t[] == 'R') {
int u = i * m + j;
int v = i * m + j + ;
edge.push(make_pair(b, make_pair(u, v)));
}
}
}
init_dset(n * m);
while (!edge.empty()) {
auto e = edge.top();
edge.pop();
int u = e.second.first;
int v = e.second.second;
if (!same(u, v)) {
unite(u, v);
adj[u].push_back(v);
adj[v].push_back(u);
}
}
init_lca(n * m);
int q;
cin >> q;
while (q--) {
int a, b, c, d;
cin >> a >> b >> c >> d;
a--; b--; c--; d--;
int u = a * m + b;
int v = c * m + d;
int k = lca(u, v);
cout << dep[u] + dep[v] - * dep[k] << endl;
}
}
ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer的更多相关文章
- ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)
ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...
- ACM-ICPC 2018 徐州赛区网络预赛 J Maze Designer(最大生成树+LCA)
https://nanti.jisuanke.com/t/31462 题意 一个N*M的矩形,每个格点到其邻近点的边有其权值,需要构建出一个迷宫,使得构建迷宫的边权之和最小,之后Q次查询,每次给出两点 ...
- ACM-ICPC 2018 徐州赛区网络预赛 J Maze Designer(最大生成树,倍增lca)
https://nanti.jisuanke.com/t/31462 要求在一个矩形中任意选两个点都有唯一的通路,所以不会建多余的墙. 要求满足上述情况下,建墙的费用最小.理解题意后容易想到首先假设全 ...
- ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer 最大生成树 lca
大概就是要每两个点 只能有一条路径,并且约束,最短的边用来砌墙,那么反之的意思就是最大的边用来穿过 故最大生成树 生成以后 再用lca计算树上两点间的距离 (当然防止生成树是一条链,可以用树的重心作为 ...
- ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心)
ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心) Trace 问答问题反馈 只看题面 35.78% 1000ms 262144K There's a beach in t ...
- 计蒜客 1460.Ryuji doesn't want to study-树状数组 or 线段树 (ACM-ICPC 2018 徐州赛区网络预赛 H)
H.Ryuji doesn't want to study 27.34% 1000ms 262144K Ryuji is not a good student, and he doesn't wa ...
- ACM-ICPC 2018 徐州赛区网络预赛 B(dp || 博弈(未完成)
传送门 题面: In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl n ...
- ACM-ICPC 2018 徐州赛区网络预赛 B. BE, GE or NE
In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl named &qu ...
- ACM-ICPC 2018 徐州赛区网络预赛 F. Features Track
262144K Morgana is learning computer vision, and he likes cats, too. One day he wants to find the ...
随机推荐
- 开发第一个Template
TEMPLATE的静态变量,当时我们一句话就带过了.TEMPLATE静态变量下面有好几个键值对,把"BACKEND"后面的值改成我们想要用的模板引擎就可以了.我们项目使用Djang ...
- jquery plupload上传插件
http://www.jianshu.com/p/047349275cd4 http://www.cnblogs.com/2050/p/3913184.html demo地址: http://chap ...
- (前缀和 内存分配)51NOD 1081 子段求和
给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和. 例如,1 3 7 9 -1,查询第2个元素开始长度为3的子段和,1 {3 7 9} -1.3 + 7 + 9 ...
- Kafka详解与总结(六)
索引 稀疏存储,每隔一定字节的数据建立一条索引(这样的目的是为了减少索引文件的大小). 下图为一个partition的索引示意图: 注: 现在对6.和8建立了索引,如果要查找7,则会先查找到8然后,再 ...
- http升级https(转)
让你的网站免费支持 HTTPS 及 Nginx 平滑升级 为什么要使用 HTTPS ? 首先来说一下 HTTP 与 HTTPS 协议的区别吧,他们的根本区别就是 HTTPS 在 HTTP 协议的基础上 ...
- 致创业者:APP已死 服务永生
前几日,有位创业者和我讲他在带领团队做一个将爱踢球的人集中在一起的App,我告诉他你的创业方向错了.原因在于你的目的是要为爱踢球的人提供服务,而你现在却在竭尽全力的做App,你应该做的是设计你为爱踢球 ...
- Dubbo和Zookeeper
一.软件架构演进 软件架构的发展经历了由单体架构.垂直架构.分布式架构到流动计算架构的演进过程. 1.单一架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.此 ...
- 继承static的注意点
继承static的注意点 singleton模式会使用 <?php class Auth { protected static $_instance = null; /** * 单用例入口 * ...
- js延时加载的方法
js的延迟加载有助与提高页面的加载速度,以下是延迟加载的几种方法: 1.使用setTimeout延迟方法的加载时间 延迟加载js代码,给网页加载留出更多时间 <script type=" ...
- Java中XML数据
Java中XML数据 XML解析——Java中XML的四种解析方式 XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解 ...