【题解】

首先,我们可以发现,A到B的所有路径中,最长边的最小值一定在最小生成树上。我们用Kruskal最小生成树时,假设有两个点集U,V,若加入一条边w(u,v)使U,V联通,那么w就是U中每个点到V中每个点的路径上的最长边。因为我们每次在可选的w中选择了最小的,所以可以满足最长边最短的要求。

我们可以做kruskal,当A与B恰好连通时,当前加入的边w就是A中的每个点到B中的每个点的最长边。

但这种做法在本题中似乎不可行。。因为本题中询问有很多组,效率上有问题(或者是我太傻了QAQ

其实也可以先跑kruskal,再做LCA倍增法来求a到b的最长边

我的做法是kruskal重构树,方法是按照kruskal求最小生成树的方式加边,但每次在加边时,新建一个节点,然后把两个点集的代表元作为其左右儿子,把新建节点的点权设为当前边的边权。

然后我们可以发现这棵树具有一些神奇的性质:

1.这棵树是一棵二叉树;

2.这棵树的父亲的点权大于左右儿子的点权;

3.在原图上,任意两点之间的路径的最长边的最小值等于kruskal重构树上它们的Lca的点权。

这样,这道题就可以完美解决了。

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100010;
int n,m,k,tot,x,y,fa[maxn],f[maxn][32],val[maxn],dep[maxn];
struct edge{int x,y,w;}e[maxn];
struct child{int l,r;}ch[maxn];
void read(int &k){
k=0; int f=1; char c=getchar();
while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
k*=f;
}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
bool cmp(edge a,edge b){return a.w<b.w;}
void dfs(int u){if (ch[u].l) dep[ch[u].l]=dep[ch[u].r]=dep[u]+1,dfs(ch[u].l),dfs(ch[u].r);}
int lca(int x,int y){
if (dep[x]<dep[y]) swap(x,y);
for (int i=0,t=dep[x]-dep[y];i<20;i++) if (t&(1<<i)) x=f[x][i];
for (int i=19;i>=0;i--) if (f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][0];
}
int main(){
read(n); read(m); read(k); tot=n;
for (int i=1;i<=m;i++) read(e[i].x),read(e[i].y),read(e[i].w);
sort(e+1,e+1+m,cmp);
for (int i=1;i<=n;i++) fa[i]=i,fa[i+n]=i+n;
for (int i=1;i<=m;i++) if (find(x=e[i].x)!=find(y=e[i].y)){
ch[++tot].l=find(x); ch[tot].r=find(y);
fa[find(x)]=fa[find(y)]=f[find(x)][0]=f[find(y)][0]=tot;
val[tot]=e[i].w;
}
dfs(tot);
for (int j=1;j<20;j++) for (int i=1;i<=tot;i++) f[i][j]=f[f[i][j-1]][j-1];
for (int i=1;i<=k;i++) read(x),read(y),printf("%d\n",val[lca(x,y)]);
return 0;
}

  

BZOJ 3732 Network 【模板】kruskal重构树的更多相关文章

  1. 【BZOJ】3732: Network【Kruskal重构树】

    3732: Network Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2812  Solved: 1363[Submit][Status][Dis ...

  2. [算法模板]Kruskal重构树

    [算法模板]Kruskal重构树 kruskal重构树是一个很常用的图论算法.主要用于解决u->v所有路径上最长边的最小值,就是找到\(u->v\)的一条路径,使路径上的最长边最小. 图片 ...

  3. bzoj 3545: [ONTAK2010]Peaks Kruskal重构树

    题目: 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经 ...

  4. BZOJ3732 Network(Kruskal重构树)

    Kruskal重构树的模板题. 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N.图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: ...

  5. BZOJ 4242: 水壶(Kruskal重构树 + Bfs)

    题意 一块 \(h ∗ w\) 的区域,存在障碍.空地.\(n\) 个建筑,从一个建筑到另一个建筑的花费为:路径上最长的连续空地的长度. \(q\) 次询问:从建筑 \(s_i\) 到 \(t_i\) ...

  6. BZOJ 5415: [Noi2018]归程(kruskal重构树)

    解题思路 \(NOI2018\)的\(Day1\) \(T1\),当时打网络赛的时候不会做.学了一下\(kruskal\)重构树后发现问题迎刃而解了.根据\(kruskal\)的性质,如果要找从\(u ...

  7. BZOJ.4144.[AMPPZ2014]Petrol(Kruskal重构树)

    BZOJ 看别人代码的时候发现哪一步都很眼熟,突然想起来,就在四个月前我好像看过还给别人讲过?mmp=v= 果然不写写就是容易忘.写了好歹忘了的时候还能复习呢(虽然和看别人的好像也没多少差别?). 首 ...

  8. Kruskal重构树+LCA || BZOJ 3732: Network

    题面:https://www.lydsy.com/JudgeOnline/problem.php?id=3732 题解:Kruskal重构树板子 代码: #include<cstdio> ...

  9. [bzoj 3732] Network (Kruskal重构树)

    kruskal重构树 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第 ...

随机推荐

  1. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/util/POILogFactory

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/util/POILogFacto ...

  2. Java事件处理机制- 事件监听器的四种实现方式

    自身类作为事件监听器 外部类作为事件监听器 匿名内部类作为事件监听器 内部类作为事件监听器 自身类作为事件监听器: import javax.swing.*; import java.awt.*; i ...

  3. 特征变化--->索引到标签的转换(IndexToString)

    package Spark_MLlib import org.apache.spark.ml.feature.{IndexToString, StringIndexer} import org.apa ...

  4. C. Searching for Graph(cf)

    C. Searching for Graph time limit per test 1 second memory limit per test 256 megabytes input standa ...

  5. Dsp和ARM的区别

    有一次上课老师在将ARM的时候说到了Dsp. Dsp(Digital Signal Process),数字信号处理技术,而Dsp芯片和ARM的结构也有很多相似之处.比如有流水线.采用哈佛结构(早期的A ...

  6. codevs1085数字游戏(环形DP+划分DP )

    1085 数字游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold     题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单, ...

  7. Unity项目 - 打砖块游戏

    基本功能:实现WASD进行视角在XY轴方向的移动,其次按下鼠标左键产生子弹bullet对面前的砖块cube进行碰撞. 主界面: 运行情况: 动态过程: 项目地址:BreakBricks 制作过程: 创 ...

  8. JavaScript入门二

    ******函数****** **函数定义** //普通函数定义 function f1() { console.log("Hello word!") } //带参数的函数 fun ...

  9. EasyUI系列学习(三)-Draggable(拖动)

    一.创建拖动组件 0.Draggable组件不依赖于其他组件 1.使用标签创建 <div class="easyui-draggable" id="box" ...

  10. iOS动画——CoreAnimation

    CoreAnimation在我之前的UIKit动画里面简单的提了一句CoreAnimation动画,其实大家别看它类库名种有个animation,实际上animation在这个库中只占有很小的地位. ...