Kruskal重构树

\(Kruskal\)构建生成树的顺序来构建\(Kruskal\)重构树

两个连通块合并时,新建一个节点,点权为联通这两个连通块边的边权,新节点向两个连通块的根连边,新节点为合并后的连通块的根

得到的树为有\(n\)个叶子节点的二叉树,其满足堆的性质

求一个点\(x\)在只经过边权不大于\(v\)的边所能到达的点。边权从小到大排序,建\(Kruskal\)重构树,得到的是一个大根堆,从\(x\)向上倍增,到达满足点权不大于\(v\)深度最浅的节点,该节点子树中的所有叶子节点\(x\)都可到达

\(code:\)

for(int i=1;i<=m;++i)
{
    int x=find(ed[i].x),y=find(ed[i].y);
    if(x==y) continue;
    val[++tot]=ed[i].v,add(tot,x),add(tot,y);
    fa[x]=fa[y]=f[x][0]=f[y][0]=tot;
    if(tot==2*n-1) break;
}
posted @ 2020-05-08 00:30  lhm_liu  阅读(186)  评论(0编辑  收藏  举报