zz:https://blog.csdn.net/ouqingliang/article/details/81206050

Kruskal重构树基于Kruskal算法。在执行算法过程中,Kruskal算法会把u,v两点所在的连通块连一条边。而这里会
新建一个节点,点权为原来的图中这条边的边权,并把此节点与u,v的祖先分别连边。最终便会得到一棵Kruskal重
构树。
很明显有如下结论:
1,这是一棵二叉树;
2,叶子节点代表原图的点,非叶子节点表示原图的一条边;
3,对于所有非叶子节点,其点权<父亲节点的点权。举个栗子:

原图:

重构树

例题:BZOJ3732(Network)

题意:给定一个图,对于每个询问求u到v的所有路径中,边的最大值最小多少?

分析:Kruskal重构树模板题。每个询问实际上就是询问在最小生成树中的u,v之间的路径的最大值。

对结论3扩展一下,可以知道:lca(u,v)的点权即为所求。

时间复杂度O(N*logN)

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
#define N 15010
int n,m,k,num,logn;
struct Edge{
int x,y,val;
};
bool operator < (const Edge a,const Edge b)
{
return a.val<b.val;
}
Edge e[N<<1];
int fa[N<<1];
int find(int x)
{
return (fa[x]==x)?x:fa[x]=find(fa[x]);
} vector<int> tr[N<<1];
void AddEdge(int x,int y)
{
tr[y].push_back(x);
} int dep[N<<1];
int f[N<<1][20];
int w[N<<1];
void dfs(int pre,int u)
//从u点开始dfs,pre为其父亲点
{
dep[u] = dep[pre]+1;
f[u][0] = pre;
for(int i=1;i<=logn && f[u][i-1];i++)
f[u][i] = f[f[u][i-1]][i-1]; int len = tr[u].size();
for(int i=0;i<len;i++)
dfs(u,tr[u][i]);
} int lca(int u,int v)
{
if(dep[u]<dep[v]) swap(u,v);
for(int i=logn;i>=0;i--)
if(dep[f[u][i]] >= dep[v])
u = f[u][i];
for(int i=logn;i>=0;i--)
if(f[u][i] != f[v][i])
{
u = f[u][i]; v = f[v][i];
}
if(u!=v) u = f[u][0];
return u;
} int main()
{
scanf("%d%d%d",&n,&m,&k);
num = n;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].val);
sort(e+1,e+m+1);
for(int i=1;i<=(n<<1);i++)
fa[i] = i;
int fx,fy;
for(int i=1,sum = 0;i<=m&&sum<n-1;i++)//建重构树
{
fx = find(e[i].x);
fy = find(e[i].y);
if(fx != fy)
{
w[++num] = e[i].val;
fa[fx] = fa[fy] = num;
AddEdge(fx,num);
AddEdge(fy,num);
sum++;
}
}
logn = log(num)/log(2);
int x,y;
dfs(0,num);//在重构树上跑次dfs,后面再来求lca
while(k--)
{
scanf("%d%d",&x,&y);
printf("%d\n",w[lca(x,y)]);
}
return 0;
}

  

Krustal重构树的更多相关文章

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

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

  2. 【BZOJ 3545】【ONTAK 2010】Peaks & 【BZOJ 3551】【ONTAK 2010】Peaks加强版 Kruskal重构树

    sunshine的A题我竟然调了一周!!! 把循环dfs改成一个dfs就可以,,,我也不知道为什么这样就不会RE,但它却是A了,,, 这周我一直在调这个题,总结一下智障错误: 1.倍增的范围设成了n而 ...

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

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

  4. 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Sta ...

  5. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

  6. bzoj 3551 kruskal重构树dfs序上的主席树

    强制在线 kruskal重构树,每两点间的最大边权即为其lca的点权. 倍增找,dfs序对应区间搞主席树 #include<cstdio> #include<cstring> ...

  7. kruskal重构树学习笔记

    \(kruskal\) 重构树学习笔记 前言 \(8102IONCC\) 中考到了,本蒟蒻不会,所以学一下. 前置知识 \(kruskal​\) 求最小(大)生成树,树上求 \(lca​\). 算法详 ...

  8. 『Kruscal重构树 Exkruscal』

    新增一道例题及讲解 Exkruscal \(Exkruscal\)又称\(Kruscal\)重构树,是一种利用经典算法\(Kruscal\)来实现的构造算法,可以将一张无向图重构为一棵具有\(2n-1 ...

  9. Kruskal重构树入门

    这个知识点好像咕咕咕了好长了..趁还没退役赶紧补一下吧.. 讲的非常简略,十分抱歉.. 前置知识 Kruskal算法 一定的数据结构基础(如主席树) Kruskal重构树 直接bb好像不是很好讲,那就 ...

随机推荐

  1. PAT Basic 1015 德才论 (25 分)

    宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人 ...

  2. VB Open 函数详解 打开、关闭、读、写文件

    (一)打开和关闭文件      1.顺序文件     打开顺序文件,我们可以使用Open语句.它的格式如下:Open pathname For [Input |Output |Append] As [ ...

  3. php内置函数分析之array_sum()

    PHP_FUNCTION(array_sum) { zval *input, *entry, entry_n; if (zend_parse_parameters(ZEND_NUM_ARGS(), & ...

  4. 做股票软件用的各种k线图

    这是各种k线图地址: http://echarts.baidu.com/echarts2/doc/example.html 个人公众号谢谢各位老铁支持 本人qq群也有许多的技术文档,希望可以为你提供一 ...

  5. NOIP模拟赛(by hzwer) T2 小奇的序列

    [题目背景] 小奇总是在数学课上思考奇怪的问题. [问题描述] 给定一个长度为 n 的数列,以及 m 次询问,每次给出三个数 l,r 和 P, 询问 (a[l'] + a[l'+1] + ... + ...

  6. angularJS拖动marker时popup一直显示

    $scope.$on('leafletDirectiveMarker.drag', function(event, arg) { arg.leafletObject.openPopup(); });

  7. visual studio 2017激活

    VS2017专业版和企业版激活密钥   Enterprise: NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Professional: KBJFW-NXHK6-W4WJM-CRMQB- ...

  8. idea使用"svn"到项目报错Error:Cannot run program "svn" (in directory "E:\XXXXXX"):CreateProcess error=2,

    使用新项目工具idea界面上导入svn项目报错: Error:Cannot run program "svn" (in directory "D:\XXXXXX" ...

  9. PHP培训教程 php生成WAP页面

    WAP(无线通讯协议)是在数字移动电话.个人手持设备(PDA等)及计算机之间进行通讯的开放性全球标准.由于静态的WAP页面在很多方面不能满足用户个性化的服务请求,因此通过WAP服务器端语言产生动态的W ...

  10. Vux的安装使用

    1.Vux的安装 1.1.vue-cli的vux模板生成项目 可以直接使用 vue-cli 的模板生成一个 vux 项目 vue init airyland/vux2 projectName 由此可以 ...