这也是一道LCT维护生成树的题。

那么我们还是按照套路,先对边进行排序,然后顺次加入。

不过和别的题有所不同的是:

在本题中,我们需要保证LCT中正好有\(n-1\)条边的时候,才能更新\(ans\)

其次,更新答案的时候,已知我们的边是最小的边,所以我们要考虑删除最大的边来考虑更新答案,而求最大边的过程,可以通过\(vis\)打标记,加一个指针随时维护来解决

最后一件事!!!!!!

一定记得判断自环!!!!!!!!

 for (int i=1;i<=m;i++)
{
int x=a[i].x,y=a[i].y;
val[++tot]=a[i].w;
if (a[i].x==a[i].y) continue; if (findroot(x)!=findroot(y))
{
link(x,tot);
link(y,tot);
//mp[mk(x,y)]=mp[mk(y,x)]=tot;
vis[i]=1;
++ymh;
}
else
{
split(x,y);
int now = mxpos[y];
cut(a[now-n].x,now);
cut(a[now-n].y,now);
vis[now-n]=0;
link(x,tot);
link(y,tot);
vis[i]=1;
}
while ((!vis[nnow] || a[nnow].x==a[nnow].y) && nnow<=m ) nnow++;
if (ymh==n-1 && a[nnow].w>=a[i].w)
{
ans=min(ans,a[nnow].w-a[i].w);
}
//cout<<nnow<<" "<<ans<<endl;
}

下面放上这个题整个的代码

// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#define mk make_pair using namespace std; inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
} const int maxn = 5e5+1e2; int ch[maxn][3];
int fa[maxn],rev[maxn];
int mx[maxn],mxpos[maxn];
int n,m;
int st[maxn];
map<pair<int,int>,int> mp;
int val[maxn]; int son(int x)
{
if (ch[fa[x]][0]==x) return 0;
else return 1;
} bool notroot(int x)
{
return ch[fa[x]][0]==x || ch[fa[x]][1]==x;
} void reverse(int x)
{
swap(ch[x][0],ch[x][1]);
rev[x]^=1;
} void update(int x)
{
mx[x]=val[x];
mxpos[x]=x;
if (ch[x][0])
{
if (mx[x]<mx[ch[x][0]])
{
mx[x]=mx[ch[x][0]];
mxpos[x]=mxpos[ch[x][0]];
}
}
if (ch[x][1])
{
if (mx[x]<mx[ch[x][1]])
{
mx[x]=mx[ch[x][1]];
mxpos[x]=mxpos[ch[x][1]];
}
}
} void pushdown(int x)
{
if (rev[x])
{
if (ch[x][0]) reverse(ch[x][0]);
if (ch[x][1]) reverse(ch[x][1]);
rev[x]=0;
}
} void rotate(int x)
{
int y=fa[x],z=fa[y];
int b=son(x),c=son(y);
if (notroot(y)) ch[z][c]=x;
fa[x]=z;
ch[y][b]=ch[x][!b];
fa[ch[x][!b]]=y;
ch[x][!b]=y;
fa[y]=x;
update(y);
update(x);
} void splay(int x)
{
int y=x,cnt=0;
st[++cnt]=y;
while (notroot(y)) y=fa[y],st[++cnt]=y;
while (cnt) pushdown(st[cnt--]);
while (notroot(x))
{
int y=fa[x],z=fa[y];
int b=son(x),c=son(y);
if (notroot(y))
{
if (b==c) rotate(y);
else rotate(x);
}
rotate(x);
}
update(x);
} void access(int x)
{
for (int y=0;x;y=x,x=fa[x])
{
splay(x);
ch[x][1]=y;
update(x);
}
} void makeroot(int x)
{
access(x);
splay(x);
reverse(x);
} int findroot(int x)
{
access(x);
splay(x);
while (ch[x][0])
{
pushdown(x);
x=ch[x][0];
}
return x;
} void split(int x,int y)
{
makeroot(x);
access(y);
splay(y);
} void link(int x,int y)
{
makeroot(x);
if (findroot(y)!=x)
{
fa[x]=y;
}
} void cut(int x,int y)
{
split(x,y);
if (ch[x][0] || ch[x][1] || ch[y][son(x)^1] || fa[x]!=y) return;
fa[x]=ch[y][0]=0;
} struct Node{
int x,y,w;
}; Node a[maxn]; bool cmp(Node a,Node b)
{
return a.w>b.w;
} int ans = 1e9;
int vis[maxn]; int main()
{
n=read();m=read();
for (int i=1;i<=m;i++)
{
a[i].x=read();
a[i].y=read();
a[i].w=read();
}
sort(a+1,a+1+m,cmp); int tot=n;
int ymh=0;
//makeroot(1);
int nnow=1; for (int i=1;i<=m;i++)
{
int x=a[i].x,y=a[i].y;
val[++tot]=a[i].w;
if (a[i].x==a[i].y) continue; if (findroot(x)!=findroot(y))
{
link(x,tot);
link(y,tot);
//mp[mk(x,y)]=mp[mk(y,x)]=tot;
vis[i]=1;
++ymh;
}
else
{
split(x,y);
int now = mxpos[y];
cut(a[now-n].x,now);
cut(a[now-n].y,now);
vis[now-n]=0;
link(x,tot);
link(y,tot);
vis[i]=1;
}
while ((!vis[nnow] || a[nnow].x==a[nnow].y) && nnow<=m ) nnow++;
if (ymh==n-1 && a[nnow].w>=a[i].w)
{
ans=min(ans,a[nnow].w-a[i].w);
}
//cout<<nnow<<" "<<ans<<endl;
}
cout<<ans; return 0;
}

洛谷4234最小差值生成树 (LCT维护生成树)的更多相关文章

  1. 洛谷.4234.最小差值生成树(LCT)

    题目链接 先将边排序,这样就可以按从小到大的顺序维护生成树,枚举到一条未连通的边就连上,已连通则(用当前更大的)替换掉路径上最小的边,这样一定不会更差. 每次构成树时更新答案.答案就是当前边减去生成树 ...

  2. 洛谷P4234 最小差值生成树(LCT,生成树)

    洛谷题目传送门 和魔法森林有点像,都是动态维护最小生成树(可参考一下Blog的LCT总结相关部分) 至于从小到大还是从大到小当然无所谓啦,我是从小到大排序,每次枚举边,还没连通就连,已连通就替换环上最 ...

  3. 洛谷 P4234 最小差值生成树(LCT)

    题面 luogu 题解 LCT 动态树Link-cut tree(LCT)总结 考虑先按边权排序,从小到大加边 如果构成一颗树了,就更新答案 当加入一条边,会形成环. 贪心地想,我们要最大边权-最小边 ...

  4. 【刷题】洛谷 P4234 最小差值生成树

    题目描述 给定一个标号为从 \(1\) 到 \(n\) 的.有 \(m\) 条边的无向图,求边权最大值与最小值的差值最小的生成树. 输入输出格式 输入格式: 第一行两个数 \(n, m\) ,表示图的 ...

  5. 洛谷P2387 [NOI2014]魔法森林(lct维护最小生成树)

    题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2,3,…,n,边标号为 1,2,3,…, ...

  6. 洛谷2387 NOI2014魔法森林(LCT维护最小生成树)

    本题是运用LCT来维护一个最小生成树. 是一个经典的套路 题目中求的是一个\(max(a_i)+max(b_i)\)尽可能小的路径. 那么这种的一个套路就是,先按照一维来排序,然后用LCT维护另一维 ...

  7. 【洛谷3950】部落冲突(LCT维护连通性)

    点此看题面 大致题意: 给你一棵树,\(3\)种操作:连一条边,删一条边,询问两点是否联通. \(LCT\)维护连通性 有一道类似的题目:[BZOJ2049][SDOI2008] Cave 洞穴勘测. ...

  8. 洛谷4219 BJOI2014大融合(LCT维护子树信息)

    QWQ 这个题目是LCT维护子树信息的经典应用 根据题目信息来看,对于一个这条边的两个端点各自的\(size\)乘起来,不过这个应该算呢? 我们可以考虑在LCT上多维护一个\(xv[i]\)表示\(i ...

  9. 洛谷P4234 最小差值生成树(lct动态维护最小生成树)

    题目描述 给定一个标号为从 11 到 nn 的.有 mm 条边的无向图,求边权最大值与最小值的差值最小的生成树. 输入输出格式 输入格式:   第一行两个数 n, mn,m ,表示图的点和边的数量. ...

随机推荐

  1. 第一章 Net 5.0 快速开发框架 YC.Boilerplate--框架介绍

    YC.Boilerplate 框架介绍 YC.Boilerplate 是一套快速开发框架,采用当下流行的前后端分离开发模式,前端 采用VUE.后端采用Net 5.0:框架实现了 多租户.动态webAp ...

  2. nacos配置

    server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: #nacos 服务 ...

  3. Spring笔记(4)

    集成Web环境 1.步骤 导入Spring-web坐标 <!-- spring-web--> <dependency> <groupId>org.springfra ...

  4. git clone 设置临时的 proxy

    export ALL_PROXY=socks5://127.0.0.1:1086 git clone --depth 1 https://github.com/xxx/xxx.git unset AL ...

  5. Java基础之类加载器

    Java类加载器是用户程序和JVM虚拟机之间的桥梁,在Java程序中起了至关重要的作用,理解它有利于我们写出更优雅的程序.本文首先介绍了Java虚拟机加载程序的过程,简述了Java类加载器的加载方式( ...

  6. Xilinx约束学习笔记(三)—— 时序概念

    3. 时序概念 发现对于时序基础的介绍这一块,Intel 的文档竟然要比 Xilinx 的详细,因此引用了很多 Intel 的文档内容. 3.1 术语 发送沿(launch edge),指用来发送数据 ...

  7. 数据库实验sql代码 myemployees 以及mygirl

    /* Navicat Premium Data Transfer Source Server : mysql Source Server Type : MySQL Source Server Vers ...

  8. oracle table()函数

    PL/SQL表---table()函数用法/* PL/SQL表---table()函数用法:利用table()函数,我们可以将PL/SQL返回的结果集代替table. oracle内存表在查询和报表的 ...

  9. Spring Boot 2.x 之构建Fat Jar和可执行Jar

    Spring Boot提供的Maven插件spring-boot-maven-plugin可以用来构建Fat Jar和可执行Jar. 1.Fat Jar Fat Jar需要使用 java -jar x ...

  10. 洛谷P1125——笨小猴(简易模拟)

    https://www.luogu.org/problem/show?pid=1125 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去 ...