看见某大佬在做,决定补一发题解$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 货车运输 倍增+最大生成树的更多相关文章

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

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

  2. Luogu P1967 货车运输(Kruskal重构树)

    P1967 货车运输 题面 题目描述 \(A\) 国有 \(n\) 座城市,编号从 \(1\) 到 \(n\) ,城市之间有 \(m\) 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 \ ...

  3. LUOGU P1967 货车运输(最大生成树+树剖+线段树)

    传送门 解题思路 货车所走的路径一定是最大生成树上的路径,所以先跑一个最大生成树,之后就是求一条路径上的最小值,用树剖+线段树,注意图可能不连通.将边权下放到点权上,但x,y路径上的lca的答案不能算 ...

  4. [洛谷 P1967] 货车运输 (最大生成树 lca)

    题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...

  5. 洛谷P1967货车运输——倍增LCA

    题目:https://www.luogu.org/problemnew/show/P1967 就是倍增LCA的裸题,注意一些细节即可. 代码如下: #include<iostream> # ...

  6. Luogu P1967 货车运输

    qwq 这题是知道了正解做法才写的.. 求每两点间最小权值最大的路径,本来我以为要每个点都跑一遍dij(?),后来意识到生成树好像是用来找这个的( ´▽`) 然后我问dtxdalao对不对,他说“我记 ...

  7. 「NOIP2013」「LuoguP1967」货车运输(最大生成树 倍增 LCA

    题目描述 AA国有nn座城市,编号从 11到nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最 ...

  8. kruskal - 倍增 - 并查集 - Luogu 1967 货车运输

    P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...

  9. NOIP2013 货车运输(最大生成树,倍增)

    NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...

随机推荐

  1. POJ3621Sightseeing Cows

    Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10595   Accepted: 3632 ...

  2. 洛谷P2878 [USACO07JAN]保护花朵Protecting the Flowers

    题目描述 Farmer John went to cut some wood and left N (2 ≤ N ≤ 100,000) cows eating the grass, as usual. ...

  3. mysqladmin命令用法

    mysqladmin 工具的使用格式: mysqladmin [option] command [command option] command ...... option 选项: -c  numbe ...

  4. C语言32关键字

    关键字 说明 auto 声明自动变量 short 声明短整型变量或函数 int 声明整型变量或函数 long 声明长整型变量或函数 float 声明浮点型变量或函数 double 声明双精度变量或函数 ...

  5. [51nod1106]质数检测

    解题关键: 根据质数的定义,在判断一个数n是否是质数时,我们只要用1至n-1去除n,看看能否整除即可.但我们有更好的办法.先找一个数m,使m的平方大于n,再用<=m的质数去除n(n即为被除数), ...

  6. redis GEO地理位置命令介绍

    GEOADD keylongitude latitude member [longitude latitude member ...] Available since 3.2.0. Time comp ...

  7. Pig Latin JOIN (inner) 与JOIN (outer)的区别

    1.内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现 2.外连接: 包括 (1)左外连接(左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不加限制) 3. ...

  8. vue前端+java后端 vue + vuex + koa2开发环境搭建及示例开发

    vue + vuex + koa2开发环境搭建及示例开发 https://segmentfault.com/a/1190000012918518 vue前端+java后端 https://blog.c ...

  9. 高性能服务器设计(Jeff Darcy's notes on high-performance server design

    高性能服务器设计(Jeff Darcy's notes on high-performance server design 我想通过这篇文章跟大家共享一下我多年来怎样开发“服务器”这类应用的一些想法和 ...

  10. webpack4下import()模块按需加载,打包按需切割模块,减少包体积,加快首页请求速度

    一:背景 因为项目功能越加越多,打包后的体积越来越大,导致首页展示的时候速度比较慢,因为要等压缩的js的包加载完毕. 首页展示的时候只需要对应的js,并不需要全部的js模块,所以这里就可以用按需加载, ...