Kruskal重构树的模板题。

给你N个点的无向图 (1 <= N <= 15,000),记为:1…N。
图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 < = d_j < = 1,000,000,000).

现在有 K个询问 (1 < = K < = 20,000)。
每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1e5+10,INF=1e9,B=19;
4 inline int read(){
5 char c=getchar();int x=0,f=1;
6 while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
7 while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
8 return x*f;
9 }
10 int fa[N],f[N][21],ch[N][21],cnt,val[N],dep[N];
11 int n,M,K;
12
13 struct Edge{
14 int u,v,w;
15 bool operator< (const Edge &rhs) const {
16 return w<rhs.w;
17 }
18 }E[N];
19 int num=0;
20
21 inline void add(int x,int y,int z){
22 E[++num]=(Edge){x,y,z};
23 }
24
25 int find(int x){
26 if(fa[x]==x) return fa[x];
27 else return fa[x]=find(fa[x]);
28 }
29
30 void Kruskal(){
31 sort(E+1,E+num+1);//按边的权值排序
32 int tot=0;
33 for(int i=1;i<=M;i++){
34 int x=E[i].u,y=E[i].v;
35 int fx=find(x),fy=find(y);
36 if(fx!=fy){//建树
37 ch[++cnt][0]=fx,ch[cnt][1]=fy;
38 fa[fa[x]]=fa[fa[y]]=f[fa[x]][0]=f[fa[y]][0]=cnt;
39 val[cnt]=E[i].w;//边权转化为点权
40 }
41 }
42 }
43
44 void dfs(int x){//求深度
45 if(!ch[x][0]&&!ch[x][1]) return ;//叶子节点
46 dep[ch[x][0]]=dep[ch[x][1]]=dep[x]+1;
47 dfs(ch[x][0]);dfs(ch[x][1]);
48 }
49
50 int LCA(int x,int y){//倍增求LCA
51 if(dep[x]<dep[y]) swap(x,y);
52 for(int i=B;i>=0;i--){
53 if(dep[f[x][i]]>=dep[y])
54 x=f[x][i];
55 }
56 if(x==y) return x;
57 for(int i=B;i>=0;i--){
58 if(f[x][i]!=f[y][i])
59 x=f[x][i],y=f[y][i];
60 }
61 return f[x][0];
62 }
63
64 main(){
65 cnt=n=read();M=read();K=read();
66 for(int i=1;i<=n<<1;i++) fa[i]=i;//初始化
67 for(int i=1;i<=M;i++){
68 int x=read(),y=read(),z=read();
69 add(x,y,z);
70 }
71 Kruskal();//重构树
72 dep[cnt]=1;dfs(cnt);//cnt重构完后所有的节点数,也是当前的根节点
73 for(int i=1;i<=B;i++){
74 for(int j=1;j<=2*N;j++)
75 f[j][i]=f[f[j][i-1]][i-1];//ST表
76 }
77 while(K--){
78 int x=read(),y=read();
79 cout<<val[LCA(x,y)]<<endl; //答案就是x,y最近公共祖先的点权
80 }
81 return 0;
82 }

BZOJ3732 Network(Kruskal重构树)的更多相关文章

  1. BZOJ3732: Network(Kruskal重构树)

    题意 Link 给出一张$n$个点的无向图,每次询问两点之间边权最大值最小的路径 $n \leqslant 15000, m \leqslant 30000, k \leqslant 20000$ S ...

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

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

  3. 【BZOJ 3732】 Network Kruskal重构树+倍增LCA

    Kruskal重构树裸题, Sunshine互测的A题就是Kruskal重构树,我通过互测了解到了这个神奇的东西... 理解起来应该没什么难度吧,但是我的Peaks连WA,,, 省选估计要滚粗了TwT ...

  4. BZOJ3732 (Kruskal重构树)

    Kruskal重构树上\(x\)和\(v\)的\(lca\)的权值即为它们最长路最小值 #include <cstdio> #include <iostream> #inclu ...

  5. BZOJ 3732: Network Kruskal 重构树

    模板题,练练手~ Code: #include <cstdio> #include <algorithm> #define N 80000 #define setIO(s) f ...

  6. Kruskal重构树学习笔记+BZOJ3732 Network

    今天学了Kruskal重构树,似乎很有意思的样子~ 先看题面: BZOJ 题目大意:$n$ 个点 $m$ 条无向边的图,$k$ 个询问,每次询问从 $u$ 到 $v$ 的所有路径中,最长的边的最小值. ...

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

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

  8. BZOJ 3732 Network 【模板】kruskal重构树

    [题解] 首先,我们可以发现,A到B的所有路径中,最长边的最小值一定在最小生成树上.我们用Kruskal最小生成树时,假设有两个点集U,V,若加入一条边w(u,v)使U,V联通,那么w就是U中每个点到 ...

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

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

随机推荐

  1. HMS Core Discovery第16期回顾|与虎墩一起,玩转AI新“声”态

    HMS Core 在AI领域最新的技术能力有哪些?本期Discovery直播以<与虎墩一起,玩转AI新"声"态>为主题,邀请了HMS Core 机器学习服务产品经理.机 ...

  2. linux nginx启用php

    cd /usr/local/php/etc mv php-fpm.conf.default php-fpm.conf vi /usr/local/nginx/conf/nginx.conf # 删除如 ...

  3. TS入门基础

    1,使用node.js 2,配置typescript node i -g typescript 3,创建ts文件 使用tsc + <文件名>在命令行中跑可以跑出一个一样得js文件默认生成的 ...

  4. Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  5. Excel 文本函数(二):CONCATENATE 和 CONCAT

    在 Excel 2016.Excel Mobile 和 Excel 网页版中,CONCATENATE 函数已替换为 CONCAT 函数. CONCATENATE 函数只能拼接单个单元格或文本字符,不能 ...

  6. Python小游戏——外星人入侵(保姆级教程)第一章 05重构模块game_functions

    系列文章目录 第一章:武装飞船 05:重构:模块game_functions 一.重构 在大型项目中,经常需要在添加新代码前重构既有代码.重构旨在简化既有代码的结构,使其更容易扩展.在本节中,我们将创 ...

  7. C语言重定向输入:txt文件内容是中文,重定向输入显示乱码的原因

    一.txt文件中的内容是中文,重定向输入显示乱码原因: 是因为文本文件的编码和和编译器的不一致导致的.我文本文件用的编码是UTF-8,而编译器是ANSI,不匹配,所以输出乱码.文本另存为时把编码改为A ...

  8. 2-1 走进selenium新世界

    走进Selenium新世界 浏览器 Firefox Setup 35.0.1 安装完成后设置菜单栏 关闭浏览器自动更新 插件配置(必备武器) FireBug Firebug是firefox下的一个扩展 ...

  9. CobaltStrike插件编写(1)-权限维持

    自嘲:今天打开博客园一看,好家伙我竟然还有账户,原来我注册了博客园啊. CobaltStrike插件-权限维持模块 方法都是网上常见的,正好在学怎么写插件,练手之作,大佬勿喷. popup beaco ...

  10. django_day03

    django_day03 Django的view(视图) CBV和FBV FBV:function based view 基于函数的视图 CBV:class based view 基于类的视图 fro ...