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 ...
随机推荐
- 用nginx搭建基于rtmp或者http的flv、mp4流媒体服务器
http://itindex.NET/detail/48702-nginx-rtmp-http 一.流媒体播放方式 1. HTTP方式 这种方式要下载FLV视频文件到本地播放,一旦FLV视频文件下载 ...
- Probabilistic interpretation
Under the previous probabilistic assumptions on the data, least-squares regression corresponds to fi ...
- angularJs模版注入的两种方式
一,声名式注入 1:app.js: var myApp = angular.module("myApp",["ngRoute"]); 2:controller. ...
- js滚轮事件需要注意的兼容性问题
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- bzoj 1598: [Usaco2008 Mar]牛跑步【A*K短路】
A*K短路模板,详见https://blog.csdn.net/z_mendez/article/details/47057461 算法流程: 把有向图全建成反向边,跑一遍所有点到t的最短路记为dis ...
- bzoj1015星球大战(并查集+离线)
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 5572 Solved: 2563 Descri ...
- 解决phpmyadmin数据文件导入有限制的问题(只能导入2M以下)
修改配置php.ini文件中三个参数: 1.upload_max_filesize 2.memory_limit 3.post_max_size 建议根据实际需要进行设置.
- Maven构建的生命周期
什么是构建生命周期 构建生命周期是一组阶段的序列(sequence of phases),每个阶段定义了目标被执行的顺序.这里的阶段是生命周期的一部分.举例说明,一个典型的 Maven 构建生命周期是 ...
- 洛谷P3366 【模板】最小生成树(Kruskal)
题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M<= ...
- Y-C
1.asp.net服务控件生命周期 11个生命阶段 (1)初始化: 初始化在传入Web请求生命周期内所需的设置,.跟踪视图状态.页面框架通过默认方式引发Init事件,并调用OnInit()方法,控件开 ...