洛谷题目传送门 和魔法森林有点像,都是动态维护最小生成树(可参考一下Blog的LCT总结相关部分) 至于从小到大还是从大到小当然无所谓啦,我是从小到大排序,每次枚举边,还没连通就连,已连通就替换环上最小的一条边,可以保证最优.如果已经构成了生成树,就可以更新答案,因为当前枚举到的一定是生成树里最大的,所以直接用当前减去最小更新答案. 至于最小的怎样维护,其实根本不需要什么别的set什么的数据结构.只要标记一下在生成树中的边,再搞一个指针指向在树中最小的边就好啦.当最小的边也被替换,就把指针后移,…
题目描述 给定一个标号为从 \(1\) 到 \(n\) 的.有 \(m\) 条边的无向图,求边权最大值与最小值的差值最小的生成树. 输入输出格式 输入格式: 第一行两个数 \(n, m\) ,表示图的点和边的数量. 第二行起 \(m\) 行,每行形如 \(u_i, v_i, w_i\)​ ,代表 \(u_i\)​ 到 \(v_i\)​ 间有一条长为 \(w_i\)​ 的无向边. 输出格式: 输出一行一个整数,代表你的答案. 数据保证存在至少一棵生成树. 输入输出样例 输入样例#1: 4 6 1…
题目类型:\(LCT\)动态维护最小生成树 传送门:>Here< 题意:求一棵生成树,其最大边权减最小边权最小 解题思路 和魔法森林非常像.先对所有边进行排序,每次加边的时候删除环上的最小边即可 正确性好像很显然,显然由于每一条边一定会被加入,所以最大边权是可以确定的,然后在所有小于等于自己的边权中已经尽量去除了最小的,这是一个贪心 问题在于,由于这里和魔法森林不一样,不要求一个路径上的,而是整颗生成树.因此单单利用\(split\)来维护好像有点棘手. 我们考虑我们是按从小到大的顺序加边的,…
题目描述 给定一个标号为从 11 到 nn 的.有 mm 条边的无向图,求边权最大值与最小值的差值最小的生成树. 输入输出格式 输入格式:   第一行两个数 n, mn,m ,表示图的点和边的数量. 第二行起 mm 行,每行形如 u_i, v_i, w_iui​,vi​,wi​ ,代表 u_iui​ 到 v_ivi​ 间有一条长为 w_iwi​ 的无向边.   输出格式:   输出一行一个整数,代表你的答案. 数据保证存在至少一棵生成树.   输入输出样例 输入样例#1: 复制 4 6 1 2…
题面 luogu 题解 LCT 动态树Link-cut tree(LCT)总结 考虑先按边权排序,从小到大加边 如果构成一颗树了,就更新答案 当加入一条边,会形成环. 贪心地想,我们要最大边权-最小边权最小 最大边权固定就是新加入的这条边,我们要让最小边权尽量地大 那么我们可以去掉原先路径上最小的那一条边,这样一定不会差 以上,可以用LCT维护 ps:LCT只有点权,所以对于每条边,新建一个节点 Code #include<bits/stdc++.h> #define mp make_pair…
题目链接 先将边排序,这样就可以按从小到大的顺序维护生成树,枚举到一条未连通的边就连上,已连通则(用当前更大的)替换掉路径上最小的边,这样一定不会更差. 每次构成树时更新答案.答案就是当前边减去生成树上最小边的权值. LCT上维护最小边的编号.求最小边把树上的边用vis[]标记即可. 不熟啊. (另外暴力可以排序后枚举一个分界点,在它之后求最小生成树,在它之前求最大生成树) #include <cstdio> #include <cctype> #include <algor…
这也是一道LCT维护生成树的题. 那么我们还是按照套路,先对边进行排序,然后顺次加入. 不过和别的题有所不同的是: 在本题中,我们需要保证LCT中正好有\(n-1\)条边的时候,才能更新\(ans\) 其次,更新答案的时候,已知我们的边是最小的边,所以我们要考虑删除最大的边来考虑更新答案,而求最大边的过程,可以通过\(vis\)打标记,加一个指针随时维护来解决 最后一件事!!!!!! 一定记得判断自环!!!!!!!! for (int i=1;i<=m;i++) { int x=a[i].x,y…
题目 P4234 最小差值生成树 做法 和这题解法差不多,稍微变了一点,还不懂就直接看代码吧 \(update(2019.2):\)还是具体说一下吧,排序,直接加入,到了成环情况下,显然我们要把此边代替掉环内的最小边 就可以用\(LCT\)维护 My complete code #include<cstdio> #include<cstring> #include<string> #include<iostream> #include<algorith…
\(\color{#0066ff}{ 题目描述 }\) 给定一个标号为从 \(1\) 到 \(n\) 的.有 \(m\) 条边的无向图,求边权最大值与最小值的差值最小的生成树. \(\color{#0066ff}{输入格式}\) 第一行两个数 \(n, m\),表示图的点和边的数量. 第二行起 mm 行,每行形如 u_i, v_i, w_iui,vi,wi,代表 u_iui 到 v_ivi 间有一条长为 w_iwi 的无向边. \(\color{#0066ff}{输出格式}\) 输出一行一个整数…
题目链接 能把LCT打得每个函数都恰有一个错误也是挺令我惊讶的. 本题使用LCT维护生成树,具体做法是对原图中的每个边建一个点,然后连边的时候相当于是将边的起点跟“边”这个点连起来,边的终点也跟它连起来. 放个图. 比如这是原边. 然后我们搞成这样. 那个小点就是原来那条边啦. 然后我们要连边的时候就连成这样 比如小点的编号为new,我们就要link(from,new),link(to,new) 切掉的时候就cut(from,new)cut(to,new). 之后呢,我们令splay的每个节点维…