Luogu P1967 货车运输 倍增+最大生成树
看见某大佬在做,决定补一发题解$qwq$
首先跑出最大生成树(注意有可能不连通),然后我们要求的就是树上两点间路径上的最小边权。 我们用倍增的思路跑出来$w[u][j]$,表示$u$与的它$2^j$的祖先路径上的最小边权(其实是为了配合$lca$),然后求$lca$时顺便记一下最小边权。
码风清奇别在意是之前写的
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define R register int
using namespace std;
namespace jack {
#define N 100010
#define M 500010
#define Inf 0x3f3f3f3f
int n,m,q,cnt,lim,fir[N],dep[N],f[N][],w[N][],fa[N];
bool vis[N];
struct Edge {
int u,v,w;
bool operator < (const Edge& y)const{return w>y.w;}
}E[M];
struct edge {int v,w,nxt;}e[M];
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=(ret<<)+(ret<<)+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
//inline int min(int a,int b) {return a<b?a:b;}
inline void add(int u,int v,int w) {e[++cnt].v=v,e[cnt].w=w,e[cnt].nxt=fir[u],fir[u]=cnt;}
int getf(int x) {return x==fa[x]?x:fa[x]=getf(fa[x]);}
inline bool merge(int u,int v) {
R uf=getf(u),vf=getf(v);
if(uf==vf) return true;
fa[uf]=vf; return false;
}
inline void kruskal() {
sort(E+,E+m+);
for(R i=;i<=n;i++) fa[i]=i;
for(R i=,u=E[i].u,v=E[i].v,w=E[i].w;i<=m;i++,u=E[i].u,v=E[i].v,w=E[i].w)
if(!merge(u,v)) {add(u,v,w),add(v,u,w);}
}
void dfs(int u) {
vis[u]=true;
for(R i=fir[u];i;i=e[i].nxt) {
R v=e[i].v; if(dep[v]) continue;
dep[v]=dep[u]+;f[v][]=u,w[v][]=e[i].w;
for(R j=,fa=u;f[fa][j];j++) f[v][j+]=f[fa][j],fa=f[fa][j];
dfs(v);
}
}
inline int lca(int u,int v) {
if(getf(u)!=getf(v)) return -; R ans=Inf;
if(dep[u]<dep[v]) swap(u,v);
for(R i=lim;i>=;i--) if(dep[f[u][i]]>=dep[v]) ans=min(ans,w[u][i]),u=f[u][i];
if(u==v) return ans;
for(R i=lim;i>=;i--) if(f[u][i]!=f[v][i]) ans=min(ans,min(w[u][i],w[v][i])),u=f[u][i],v=f[v][i];
return min(ans,min(w[u][],w[v][]));
}
void main() {
n=g(),m=g(); lim=log2(n)+;
for(R i=;i<=m;i++) {E[i].u=g(),E[i].v=g(),E[i].w=g();}
kruskal();
for(R i=;i<=n;i++) if(!vis[i]) {dep[i]=;dfs(i);f[i][]=i,w[i][]=Inf;}
for(R i=;i<=lim;i++) for(R j=;j<=n;j++) {
f[j][i]=f[f[j][i-]][i-];
w[j][i]=min(w[j][i-],w[f[j][i-]][i-]);
} q=g();
for(int i=; i<=q; i++) {R u=g(),v=g(); printf("%d\n",lca(u,v));}
}
} signed main() {jack::main();}
Luogu P1967 货车运输 倍增+最大生成树的更多相关文章
- 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增
倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...
- Luogu P1967 货车运输(Kruskal重构树)
P1967 货车运输 题面 题目描述 \(A\) 国有 \(n\) 座城市,编号从 \(1\) 到 \(n\) ,城市之间有 \(m\) 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 \ ...
- LUOGU P1967 货车运输(最大生成树+树剖+线段树)
传送门 解题思路 货车所走的路径一定是最大生成树上的路径,所以先跑一个最大生成树,之后就是求一条路径上的最小值,用树剖+线段树,注意图可能不连通.将边权下放到点权上,但x,y路径上的lca的答案不能算 ...
- [洛谷 P1967] 货车运输 (最大生成树 lca)
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- 洛谷P1967货车运输——倍增LCA
题目:https://www.luogu.org/problemnew/show/P1967 就是倍增LCA的裸题,注意一些细节即可. 代码如下: #include<iostream> # ...
- Luogu P1967 货车运输
qwq 这题是知道了正解做法才写的.. 求每两点间最小权值最大的路径,本来我以为要每个点都跑一遍dij(?),后来意识到生成树好像是用来找这个的( ´▽`) 然后我问dtxdalao对不对,他说“我记 ...
- 「NOIP2013」「LuoguP1967」货车运输(最大生成树 倍增 LCA
题目描述 AA国有nn座城市,编号从 11到nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最 ...
- kruskal - 倍增 - 并查集 - Luogu 1967 货车运输
P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...
- NOIP2013 货车运输(最大生成树,倍增)
NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...
随机推荐
- Arc077_E Guruguru
传送门 题目大意 有$m$个点编号从小到大按照顺时针编成了一个环,有一枚棋子,每次移动可以选择顺时针移动到下一个或者直接移动到编号为$x$的点,现在有$n-1$次数操作,第$i$次要把棋子从第$A_i ...
- Qt Quick之Canvas
QML中的Canvas,俗称画布,它用来定义一个绘图区域,可以使用ECMAScript代码来绘制直线,矩形,贝塞尔曲线,弧线,图片,文字等图元,还可以为这些图元应用填充颜色和边框颜色,甚至还可以进行低 ...
- c#迭代遍历带数组的json格式数据
[1]首先我们先创建一个带数组形式的json格式的数组 1)我们按照结构定义一个类,如下: using System;using System.Collections.Generic;using Sy ...
- CH#56C 异象石 和 BZOJ3991 [SDOI2015]寻宝游戏
异象石 CH Round #56 - 国庆节欢乐赛 描述 Adera是Microsoft应用商店中的一款解谜游戏. 异象石是进入Adera中异时空的引导物,在Adera的异时空中有一张地图.这张地图上 ...
- 3 K8s安裝ELK+filebeat
1 Filebeat: apiVersion: v1 kind: Service metadata: name: XX spec: ports: - name: http port: targetPo ...
- 自定义滚动条jQuery插件- Perfect Scrollbar
主要特性: 不需要修改任何的元素的css 滚动条不影响最初的页面布局设计 滚动条支持完整的自定义 滚动条的尺寸和位置会随着容器尺寸或者内容的变化而变化 依赖于jQuery和相关几个类库 不需要定义宽度 ...
- redis持久化 发布消息与订阅
vi /usr/local/redis/etc/redis.conf 快照方式: save 900 1 save 300 10 save 60 10000 aof方式: ap ...
- Hive之数据查询
Hive之数据查询 发布于:2013 年 10 月 11 日 由 Aaron发布于: Hive 一,排序和聚合 对于排序有两种方式,一种是order by 一种是sort by order by 会对 ...
- win7中配置eclipse连接Ubuntu内的hadoop
Hadoop java 分布式 云计算 数据库 目录[-] 1.设置Ubuntu静态IP: 1)配置网卡参数到interfaces文件: 2)重启网卡: 2.配置Ubuntu的hosts: 3.配置V ...
- Android 设计模式情景分析——观察者模式
观察者模式是一种使用频率非常高的模式,有时也被称作发布/订阅模式,属于行为型模式,它最常用的是 GUI 系统.订阅——发布系统,它一个重要作用就是解耦,使得它们之间的依赖性更小.观察者模式定义了对象间 ...