传送门

总算是做上一道LCA的应用题了...

题意:有$n$个牧场, $m$根管道分别连接编号为$u,v$的牧场花费$p_{i}$,在第$i$个牧场挖口井需要花费$w_{i}$,有$P$根管道直接连通着$u,v$,即免费连上$u,v$

对每根免费管道输出让所有牧场都有水的最小花费

先是最小生成树,用0去连每一个点,边权就是每个点的权值,然后正常建,跑一遍最小生成树,把用到的边重新建一次图,然后就对每次询问的$u,v$,减掉他们之间的路径的最长边就是答案了

因为删去这其中一条边,再免费连上$u,v$,最后还是一棵树,最小花费就减去最长边就好了。

然后求两点路径上的最长边就得用到倍增LCA,本来有点想不太明白,然后画了个图就清楚了,再预处理的dfs中,求每个点的LCA就可以直接求最长边了

$cost[u][i]$表示u往上走$2^{i}$步之间的最长边

转移就是$cost[u][i]=\max (cost[u][i-1], cost[lca[u][i-1]][i-1])$
求出来的是$u$往上走1, 2, 4, ...步的距离

如果需要往上走3步的 答案即为$max(cost[u][0], cost[lca[u][0]][1])$

这在查询过程中实现即可

#include <bits/stdc++.h>
using namespace std; inline int read() {
int x = , f = ; char ch = getchar();
while (ch < '' || ch > '') { if (ch == '-') f = -; ch = getchar(); }
while (ch >= '' && ch <= '') { x = x * + ch - ; ch = getchar(); }
return x * f;
} const int N = 5e3 + ;
const int M = 3e5 + ;
struct Edge1 {
int u, v, c;
bool operator < (const Edge1 &rhs) const {
return c < rhs.c;
}
} e[N + M];
struct Edge {int v, next, c;} edge[*N];
int cnt, head[N], fa[N], lca[N][], cost[N][], dep[N], n, m, q;
bool vis[N];
inline void addedge(int u, int v, int c) {
edge[cnt].v = v; edge[cnt].c = c; edge[cnt].next = head[u]; head[u] = cnt++;
}
void init() {
cnt = ;
for (int i = ; i <= n; i++) fa[i] = i, head[i] = -, dep[i] = , vis[i] = false;
memset(cost, , sizeof(cost));
memset(lca, , sizeof(lca));
}
int getfa(int x) { return x == fa[x] ? x : fa[x] = getfa(fa[x]); } void dfs(int u) {
lca[u][] = fa[u];
vis[u] = ;
for (int i = ; i <= ; i++) {
lca[u][i] = lca[lca[u][i-]][i-];
cost[u][i] = max(cost[u][i-], cost[lca[u][i-]][i-]);
}
for (int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].v, c = edge[i].c;
if (vis[v]) continue;
dep[v] = dep[u] + ;
cost[v][] = c;
fa[v] = u;
dfs(v);
}
} int Lca(int u, int v) {
if (dep[u] < dep[v]) swap(u, v);
int ans = ;
int f = dep[u] - dep[v];
for (int i = ; i <= ; i++) {
if (f & ( << i)) {
ans = max(ans, cost[u][i]);
u = lca[u][i];
}
}
if (u == v) return ans;
for (int i = ; i >= ; i--) {
if (lca[u][i] != lca[v][i]) {
ans = max(ans, cost[u][i]);
ans = max(ans, cost[v][i]);
u = lca[u][i];
v = lca[v][i];
}
}
return max(max(ans, cost[u][]), cost[v][]);
} int main() {
while (~scanf("%d%d%d", &n, &m, &q)) {
init();
int sum = ;
int tol = ;
for (int i = ; i <= n; i++) {
int p = read();
e[++tol].u = ; e[tol].v = i; e[tol].c = p;
}
for (int i = ; i <= m; i++) {
int u = read(), v = read(), c = read();
e[++tol].u = u, e[tol].v = v, e[tol].c = c;
}
sort(e + , e + + tol);
for (int i = ; i <= tol; i++) {
int u = getfa(e[i].u), v = getfa(e[i].v);
if (u == v) continue;
fa[v] = u;
sum += e[i].c;
addedge(e[i].u, e[i].v, e[i].c);
addedge(e[i].v, e[i].u, e[i].c);
}
fa[] = ;
dfs();
while (q--) {
int u = read(), v = read();
printf("%d\n", sum - Lca(u, v));
}
}
return ;
}

HDU 2887 Watering Hole(MST + 倍增LCA)的更多相关文章

  1. hdu 2586 How far away ?倍增LCA

    hdu 2586 How far away ?倍增LCA 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路: 针对询问次数多的时候,采取倍增 ...

  2. hdu 4674 Trip Advisor(缩点+倍增lca)

    花了一天半的时间,才把这道题ac= = 确实是道好题,好久没敲这么长的code了,尤其是最后的判定,各种销魂啊~ 题目中给出的条件最值得关注的就是:每个点最多只能在一个环内->原图是由一个个边连 ...

  3. 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  4. 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  5. BFS+最小生成树+倍增+LCA【bzoj】4242 水壶

    [bzoj4242 水壶] Description JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有 ...

  6. HDU2586 How far away? —— 倍增LCA

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 How far away ? Time Limit: 2000/1000 MS (Java/Ot ...

  7. 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增

    倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...

  8. [板子]倍增LCA

    倍增LCA板子,没有压行,可读性应该还可以.转载请随意. #include <cstdio> #include <cstring> #include <algorithm ...

  9. 洛谷P3128 [USACO15DEC]最大流Max Flow [倍增LCA]

    题目描述 Farmer John has installed a new system of  pipes to transport milk between the  stalls in his b ...

随机推荐

  1. tomcat启动时报No rules found matching 'Server/Service/Engine/Host/context'

    tomcat是8.0版本. 在eclipse启动时,第二行报这个, 同时项目也没加载(tomcat启动成功了). 网上搜了半天, 试了半天, 没搞定. 最后不经意间发现: <Context do ...

  2. xe.10.2的下载路径

    为了这个玩意,我折腾了一天,为了以后自己还用到 官网地址: http://altd.embarcadero.com/download/radstudio/10.2/delphicbuilder10_2 ...

  3. 数据采集,SCADA, 使用MQTT的方式来进行消息单/双向传输,什么场景使用MQTT

    1.先来了解下: 看完得出关键字:发布.订阅模式,事件驱动,主题,生产与消费解耦 2.轻量级 普通的socket连接对服务器的消耗太大了,socket服务端是很消耗资源的,一台服务器能链接的客户端是有 ...

  4. nohup 日志按天输出

    输出日志在当前目录: nohup java -jar ace-auth.jar >> nohup`date +%Y-%m-%d`.out 2>&1 & 指定日志目录输 ...

  5. Kafka 消费者

    应用从Kafka中读取数据需要使用KafkaConsumer订阅主题,然后接收这些主题的消息.在我们深入这些API之前,先来看下几个比较重要的概念. Kafka消费者相关的概念 消费者与消费组 假设这 ...

  6. Navicat 导出 表结构

    Navicat 导出 表结构 转自:https://www.cnblogs.com/xianxiaobo/p/10254737.html 1. 首先点击新建查询,然后输入下面的语句 SELECT CO ...

  7. Charles配置https

    1. 安装Charles ,破解将Charles.jar 覆盖安装路径的\lib 中的文件 2. 查看本机IP 3. 设置手机代理 4. 设置: 5. 手机安装证书 手机浏览器输入网址:chls.pr ...

  8. k8s与监控--k8s部署grafana6.0

    原文参考:https://segmentfault.com/a/1190000018335241

  9. Springboot html vue.js 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro 权限

    官网:www.fhadmin.org 特别注意: Springboot 工作流  前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ activiti6.0 ...

  10. 【开发笔记】- 在Windows环境下后台启动redis

    1. 进入 DOS窗口 2. 在进入Redis的安装目录 3. 输入:redis-server --service-install redis.windows.conf --loglevel verb ...