[洛谷P4234] 最小差值生成树】的更多相关文章

洛谷题目传送门 和魔法森林有点像,都是动态维护最小生成树(可参考一下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…
题目描述 给定一个标号为从 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…
题目类型:\(LCT\)动态维护最小生成树 传送门:>Here< 题意:求一棵生成树,其最大边权减最小边权最小 解题思路 和魔法森林非常像.先对所有边进行排序,每次加边的时候删除环上的最小边即可 正确性好像很显然,显然由于每一条边一定会被加入,所以最大边权是可以确定的,然后在所有小于等于自己的边权中已经尽量去除了最小的,这是一个贪心 问题在于,由于这里和魔法森林不一样,不要求一个路径上的,而是整颗生成树.因此单单利用\(split\)来维护好像有点棘手. 我们考虑我们是按从小到大的顺序加边的,…
题面 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的每个节点维…
题意 给定一个 \(n\) 个点 \(m\) 条边的有权无向图,求出原图的一棵生成树使得该树上最大边权与最小边权的差值最小. \(\texttt{Data Range:}1\leq n\leq 5\times 10^4,1\leq m\leq 2\times 10^5,1\leq w\leq 5\times 10^4\) 题解 这位傻逼把 \(n\) 个节点的树所含有的边的数目认为是 \(n\),还在出现环的时候立即统计答案(可能生成树都没构建出来),导致 \(\texttt{WA}\) 了一发…
LuoguP4234_最小差值生成树_LCT 题意: 给出一个无向图,求最大的边权减最小的边权最小的一棵生成树. 分析: 可以把边权从大到小排序,然后类似魔法森林那样插入. 如果两点不连通,直接连上,否则找到两点间最大的边权替换. 如果生成一棵树了就更新答案. LCT维护边权的最大值即可. 代码: // luogu-judger-enable-o2 #include <stdio.h> #include <string.h> #include <algorithm> u…
[luogu4234]最小差值生成树 luogu 从小到大枚举边,并连接,如果已连通就删掉路径上最小边 lct维护 \(ans=min(E_{max}-E_{min})\) #include<bits/stdc++.h> using namespace std; const int _=4e5+5; int re(){ int x=0,w=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();…
题目大意:给出一个n个节点的图,求最大边权值减去最小边权值最小的生成树. 题解 Flash Hu大佬一如既往地强 先把边从小到大排序 然后依次加入每一条边 如果已经连通就把路径上权值最小的边删去 然后记得更新答案 ps:不是很明白为啥我洛谷上吸了氧还跑得更慢了233 //minamoto #include<cstdio> #include<algorithm> #include<iostream> #define inf 0x3f3f3f3f using namespa…
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 不久之前我在codewars上做过一道类似的题目. 以及把它搬运到了洛谷上. 布尔表达式计数问题 考虑这样一个问题: 有两个布尔变量\(x\)和\(y\). 我们知道使\(x\)等于1的方案有\(x_1\)种,等于0的方案有\(x_0\)种:使\(y\)等于1的方案有\(y_1\)种,等于0的方案有\(y…
题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. 看洛谷上面的题解给了我很大的启发. 其中最重要的两点启发是: 启发1:中缀加操作数预处理 将原始表达式中添加上'.',这些'.'对应运算数(这么预处理能方便我接下来更方便地将前缀转后缀表达式进行处理): 启发2:动归思想 首先一个状态对应两个值,我暂且将它们设为 \(v0\) 和 \(v1\) ,其…
Slim Span Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=3522 Description Given an undirected weighted graph G, you should find one of spanning trees specified as follows. The graph G is an ordered pair (V, E), where V is a se…
描述 xxx国“山头乡”有n个村子,政府准备修建乡村公路,由于地形复杂,有些乡村之间可能无法修筑公路,因此政府经过仔细的考察,终于得到了所有可能的修路费用数据.并将其公布于众,广泛征求村民的修路意见.嗯,xxx国真是一个平等的国度. 政府考虑到费用问题,因此要求只能建n-1条公路,而且这n-1条公路还能连通n个村子,而且调查数据表明,这完全是可行的. 村民们展开了激烈的讨论,最后大家达成一致,要求每条路的费用要尽可能一样,这是基于“平等”的考虑,汗~ xxx国政府头脑简单,这这,太难了,最后双方…
题目传送门 道路费用 格式难调,题面就不放了. 分析: 这是一道要细(yan)心(jing)的生成树的好(gui)题. 首先我们看到$k$的范围非常小,那么我们就可以直接$2^k$枚举每一条加边是否选择.然后我们再按权值大小依次加原边并且更新可以影响的加边的权值上限,再树形DP求解.但是这样复杂度是$O(2^k+NM\log M)$,需要考虑优化. 我们能发现,不管加边选不选,有一些边都一定会加入到生成树中,那么我们就把这些边提前连接,然后把产生出的联通块缩点,然后就能形成一个$k+1$个点的新…
https://www.luogu.org/problemnew/show/P4234 按照边的权值从小到大排序,依次加入,并删除能够删除的权值最小的一条边,用 set 维护当前所有边的边权,并查集维护联通性,LCT 维护两点间最小值和 link cut 操作即可 #include <bits/stdc++.h> #define mp make_pair using namespace std; typedef unsigned long long ull; typedef long long…
https://www.luogu.org/recordnew/show/6125570 思路就是巧妙的枚举所有的生成树,取最优值首先按照边权排序找出第一颗最小生成树(l, r),其中l表示最小边的编号,r表示最大边的编号然后从r+1号边开始倒序枚举各边,求出第二颗最小生成树(当然也可能不存在)(l_2, r_2), r_2 = r + 1.这样的话就省去了多条最小边的枚举比如若从2 -- l_2-1中任选一条边作为最小边开始查询最大生成树,那么最大边一定为r_2这样的话差值不会比(l_2, r…
正题 题目链接:https://www.luogu.com.cn/problem/P4234 题目大意 给出\(n\)个点\(m\)条边的一张图.求一棵生成树使得最大边权减去最小边权最小. \(1\leq n\leq 5\times 10^4,1\leq m\leq 2\times 10^5\) 解题思路 按照边权排序,然后像魔法森林一样用\(LCT\)维护最小生成树就好了. 没啥别的,练练手而已.时间复杂度\(O(n\log n)\) code #include<cstdio> #inclu…
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离.对于图G 上的点对( u, v) ,若它们的距离为2 ,则它们之间会产生Wu ×Wv 的联合权值. 请问图G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 输入输出格式 输入格式: 输入文件名为link .in. 第一行包含1 个整数n . 接下来n - 1 行,…
P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. "× "运算优先于"⊕"运算,即计算表达式时,先计算× 运算,再计算⊕运算. 例如:计算表达式A⊕B × C时,先计算 B × C,其结果再与 A 做⊕运算. 现给定一个未完成的表达式,例如_+(_*_),请你在横线处填入数 0或者1 ,请问有多少种填法可以使得表达式的值为0 . 输入输出格式 输入格式: 共 2 行. 第1 行为一个整数L ,表…
题意 题目链接 Sol 一道很简单的树形dp,然而被我写的这么长 分别记录下距离为\(1/2\)的点数,权值和,最大值.以及相邻儿子之间的贡献. 树形dp一波.. #include<bits/stdc++.h> #define Fin(x) {freopen(x, "r", stdin);} #define int long long using namespace std; const int MAXN = 2e5 + 10, mod = 10007; inline in…
P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × C时,先计算 B × C,其结果再与 A 做⊕运算. 现给定一个未完成的表达式,例如_+(_*_),请你在横线处填入数字0 或者1 ,请问有多少种填法可以使得表达式的值为0 . 输入输出格式 输入格式: 输入文件名为exp.in ,共 2 行. 第1 行为一个整数 L,表示…
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离.对于图G 上的点对( u, v) ,若它们的距离为2 ,则它们之间会产生Wu×Wv 的联合权值. 请问图G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 输入输出格式 输入格式: 输入文件名为link .in. 第一行包含1 个整数n . 接下来n - 1 行,每…
https://www.luogu.org/problem/show?pid=1351 题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离.对于图G 上的点对( u, v) ,若它们的距离为2 ,则它们之间会产生Wu×Wv 的联合权值. 请问图G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 输入输出格式 输入格式…
P1981 表达式求值 题目描述 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入输出格式 输入格式: 输入文件为 expr.in. 输入仅有一行,为需要你计算的表达式,表达式中只包含数字.加法运算符“+”和乘 法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2^31-1 之间的整数.输入数据保 证这一行只有 0~ 9.+.*这 12 种字符. 输出格式: 输出文件名为 expr.out. 输出只有一行,包含一个整数,表示这个表达式的值.注意:当答案长度多于 4…
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 无向连通图\(\mathrm G\)有\(n\)个点,\(n - 1\)条边.点从\(1\)到\(n\)依次编号,编号为\(i\)的点的权值为\(W_i\) ,每条边的长度均为\(1\).图上两点\((u, v)\)的距离定义为\(u\)点到\(v\)点的最短距离.对于图\(\mathrm G\)上的点对\((u, v)\),若它们的距离为\(2\),则它们之间会产生\(W_u…