LuoguP4234_最小差值生成树_LCT

题意:

给出一个无向图,求最大的边权减最小的边权最小的一棵生成树。

分析:

可以把边权从大到小排序,然后类似魔法森林那样插入。

如果两点不连通,直接连上,否则找到两点间最大的边权替换。

如果生成一棵树了就更新答案。

LCT维护边权的最大值即可。

代码:

// luogu-judger-enable-o2
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 400050
#define M 200050
#define ls ch[p][0]
#define rs ch[p][1]
#define get(x) (ch[f[x]][1]==x)
struct A {int x,y,v;
}a[N];
bool cmp(const A &x,const A &y){return x.v>y.v;}
int ch[N][2],f[N],val[N],siz[N],rev[N],mx[N],tot,n,m,kill[M];
inline bool isrt(int p) {return ch[f[p]][1]!=p&&ch[f[p]][0]!=p;
}
inline void pushup(int p) {mx[p]=p;if(val[mx[ls]]>val[mx[p]]) mx[p]=mx[ls];if(val[mx[rs]]>val[mx[p]]) mx[p]=mx[rs];
}
inline void pushdown(int p) {if(rev[p]) {swap(ch[ls][0],ch[ls][1]);swap(ch[rs][0],ch[rs][1]);rev[ls]^=1; rev[rs]^=1;rev[p]=0;}
}
void update(int p) {if(!isrt(p))  update(f[p]);pushdown(p);
}
void rotate(int x) {int y=f[x],z=f[y],k=get(x);if(!isrt(y)) ch[z][ch[z][1]==y]=x;ch[y][k]=ch[x][!k]; f[ch[y][k]]=y;ch[x][!k]=y; f[y]=x; f[x]=z;pushup(y); pushup(x);
}
void splay(int x) {update(x);for(int fa;fa=f[x],!isrt(x);rotate(x))if(!isrt(fa))rotate(get(x)==get(fa)?fa:x);
}
void access(int p) {int t=0;while(p) {splay(p);rs=t;pushup(p);t=p;p=f[p];}
}
void makeroot(int p) {access(p); splay(p);swap(ls,rs); rev[p]^=1;
}
void link(int x,int p) {makeroot(x); splay(p); f[x]=p;
}
void cut(int x,int p) {makeroot(x); access(p); splay(p); ls=f[x]=0;
}
int find(int p) {access(p); splay(p);while(ls) pushdown(p),p=ls;return p;
}
int query(int x,int p) {makeroot(x); access(p); splay(p); return mx[p];
}
int now=1;
int calc() {while(kill[now]&&now<=m) now++;return a[now].v;
}
int main() {int ans=1<<30;scanf("%d%d",&n,&m);int i;for(i=1;i<=n;i++) mx[i]=i;for(i=1;i<=m;i++) {scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].v);}sort(a+1,a+m+1,cmp);tot=n;int ne=0;for(i=1;i<=m;i++) {int x=a[i].x,y=a[i].y;tot++;if(x==y) {kill[i]=1;continue;}int dx=find(x),dy=find(y);if(dx!=dy) {ne++;val[tot]=a[i].v; mx[tot]=tot; link(x,tot); link(tot,y);}else {int k=query(x,y);kill[k-n]=1;// printf("%d %d %d\n",k,a[k-n].x,a[k-n].y);cut(a[k-n].x,k); cut(k,a[k-n].y);val[tot]=a[i].v; mx[tot]=tot; link(x,tot); link(tot,y);}if(ne==n-1) {ans=min(ans,calc()-a[i].v);}}printf("%d\n",ans);
}

转载于:https://www.cnblogs.com/suika/p/8998185.html

LuoguP4234_最小差值生成树_LCT相关推荐

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

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

  2. [洛谷P4234]最小差值生成树

    给定一个标号为从$1$到$n$的.有$m$条边的无向图,求边权最大值与最小值的差值最小的生成树. 做法类似魔法森林,首先求出来最小生成树,然后每次加入一条边,断掉环上最小边并更新答案 这个过程我用两个 ...

  3. LeetCode简单题之学生分数的最小差值

    题目 给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数.另给你一个整数 k . 从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最 ...

  4. mysql获取两个表中日期字段的最小差值

    一.前言 开发中碰到的需求,获取两个数据表中日期字段的差值,并且取得差值最小的那条数据.本篇文章主要讲述如果通过函数获取mysql的日期差值,实际编写时遇到的问题,并且分析需求,得出最终sql等. 二 ...

  5. 算法--06年华为面试:求两个数组的最小差值(Java实现)

    Q题目 华为06年面试题(要求8分钟完成) 有两个数组a,b,大小都为n,数组元素的值任意,无序: 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小. A解法 1.常见错误逻 ...

  6. 算法--微软面试题:求一个整数数组元素间最小差值

    Q题目 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数. A解法 方案一:最愚笨的办法--暴力穷举 利用数组中所有数据两两相减的对比来求出这个最小差值. ...

  7. 「 每日一练,快乐水题 」1984. 学生分数的最小差值

    ✅力扣原题: 力扣链接:1984. 学生分数的最小差值 ✅题目简述: 给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数.另给你一个整数 k . 从数组 ...

  8. 1984. 学生分数的最小差值

    1984. 学生分数的最小差值 给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数.另给你一个整数 k . 从数组中选出任意 k 名学生的分数,使这 k ...

  9. leetcode910. 最小差值 II(贪心)

    给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回 B 的最大值和 B 的最小值之间 ...

  10. LeetCode 1984. 学生分数的最小差值

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数.另给你一个整数 k . 从数组中选出任意 k 名学生的 ...

最新文章

  1. Java写手机专题分析接口_jeesite学习文档API-内容管理模块
  2. Netty原理五:ChannelFuture、DefaultChannelPromise对象解析
  3. 电话之父贝尔的传奇一生
  4. Netweaver和SAP云平台的quota管理
  5. java根据文件路径读取文件_java根据路径读取文件
  6. php mysql数据备份命令_MySQL数据备份与恢复的相关操作命令
  7. c语言switch scanf语句,C语言中scanf函数与switch语句
  8. Win11系统下Excel怎么把0变成空白
  9. servlet里面为什么有时候覆_为什么新来的经理强烈推荐?前后端分离知识,学到了...
  10. 可执行镜像——开发环境的Docker化之路
  11. Java基础学习总结(32)——Java项目命名规范
  12. generator tar.gz file in windows
  13. 单片机IC卡读取开题报告_基于单片机的IC卡读写器设计(含开题报告)
  14. cad快看_CAD快速看图可以图纸对比吗?可以!
  15. Linux安装/升级/卸载pip3
  16. 迅雷的FLV文件迷你播放器
  17. Longhorn 云原生分布式块存储解决方案设计架构和概念
  18. 互联网日报 | 1月19日 星期二 | 腾讯音乐全资收购懒人听书;字节跳动整合硬件业务专注教育硬件;PSA与FCA正式完成合并...
  19. 基于JAVA后台微信买菜小程序系统 开题报告
  20. MindMapper中如何添加父主题

热门文章

  1. Java-如何防范CSRF攻击
  2. 电脑可以使用QQ,但是无法上网的解决方案
  3. Unity3d开发“类三消”游戏
  4. 淘金网UCskype即时通讯软件定制
  5. www.etiger.vipDEVC++入门练习
  6. Java实现 LeetCode 299 猜数字游戏
  7. Email 邮件方式激活注册账号
  8. 个人备案网站不能做博客了?
  9. 区块链能够防伪?你彷佛有什么误解!
  10. No qualifying bean of type报错问题处理