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 ...
随机推荐
- 4. extjs中form中的frame:true表示什么
转自:https://blog.csdn.net/qiu512300471/article/details/23737217 设置为true时可以为panel添加背景色.圆角边框等,如下图 下面的是f ...
- Linux 系统命令 - pwd - 显示当前所在的位置
命令详解 重要星级: ★★★★★ 功能说明: pwd命令是 "print working directory" 中每个单词的首字母缩写,其功能是显示当前工作目录的绝对路径.在实际工 ...
- Spring Theme简单应用
Spring MVC特性里由一个是关于Spring Theme主题的应用,所以写了个Demo 1.这里先看项目结构(Meven项目) 2.所需的POM依赖 <dependency> < ...
- CAS和Oauth2的区别
CAS是单点登陆(SSO) Oauth2是对某种资源进行授权访问
- PCB Genesis拼SET画工艺边 实现方法(一)
在PCB行业中,客户提供的PCB尺寸较小,为方便PCB加工,并生产提高生产效率,通常小于80X80mm需拼板处理的, 拼板要求可能来自按户指定拼板,也有可能是由工厂自行拼板,但对于CAM来说就需将PC ...
- bzoj题目大体分类
http://m.blog.csdn.net/article/details?id=51387623
- 洛谷 P1037 产生数
题目描述 给出一个整数n(n<10^30)和k个变换规则(k≤15). 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n=234.有规则(k=2): 2->53-> ...
- python 操作数据库时遇到的错误
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; ch 之前的写法是从文件里 ...
- Asp.NET 知识点总结(一)
1.简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有类,私有成员, 在类的内部才可以访问. protected : ...
- 构造+暴力 Codeforces Round #283 (Div. 2) B. Secret Combination
题目传送门 /* 构造+暴力:按照题目意思,只要10次加1就变回原来的数字,暴力枚举所有数字,string大法好! */ /************************************** ...