tree【WQS二分+MST】

2023-11-10

题目链接——洛谷(精确涉及到了WQS二分)

BZOJ-2654(不推荐)


  个人不推荐做BZOJ2654的这道题,因为那道题可以水过去,不用WQS二分也是可以的,可以直接二分答案,显然是没有这个好的。

  先在这里讲一下什么是WQS二分吧,也是从网上看来的,一开始在做这道题的时候,想到的也是存在这种可能性,但是依然WA了几次:

  先说题意:给你一个N个点M条边无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有K条白色边的生成树。

  然后WQS二分:也就是在黑边与白边存在相等的时候,我们直接二分的话,是得不到答案的,这时候就是需要去进行处理了,就有可能去取了“实际价值”更大的白边,而没有去取现实价值更小的黑边;或者现实价值更大的黑边、“实际价值”更小的白边。

  举个例子,我们现在对所有白边(先不要管为什么“加一个数”)统一加上一个值,然后,(譬如说是“+(-5)”)出现值变成「1(0),1(0),1(0),1(0),1(1),1(1),1(1)」,但是我们只需要四条边,两条白边即可,我们会很自然的选择前4条边,但是出现了4条白边的情况;再看(现在到了“+(-4)”),出现值变成「2(0),2(0),2(0),2(0),1(1),1(1),1(1)」,此时我们会拿3条黑边和1条白边的形式了。

  遇到上面这个形式应该怎么办呢,当“+(-5)”的情况的时候,其实我们就是得到了我们想要的答案了,因为需要两条白边,所以我们4 - (2 * (-5)) = 14就是我们要的答案了。(这就是WQS二分的解决办法QAQ)

  其实在这种情况下,我们固定了白边(因为上限是确定的),然后黑边因为等同于此时的“假定”白边,所以,我们实际上做了一个用黑边代替白边的过程。

  那么,上面讲到“对所有白边统一加一个数”,这是为什么呢?

  可以看到,当对所有白边的边权-INF的时候,能取尽可能多的白边了,同理的,对所有白边的边权+INF的时候,取到的白边就会尽可能的少了,条件是限行的,所以,我们可以这样二分答案去满足条件。

一组测试样例:

6 8 3
0 1 2 1
0 2 10 0
1 3 4 1
1 4 30 0
2 5 4 0
1 2 4 0
3 4 5 1
4 5 5 1
ans:27

My Code:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxE = 1e5 + 7, maxN = 5e4 + 7;
int N, M, need, line[2] = {0}, root[maxN], MST_ans;
int fid(int x) { return x == root[x] ? x : root[x] = fid(root[x]); }
struct Eddge
{
    int u, v, w, add;
    Eddge(int a=0, int b=0, int c=0, int d=0):u(a), v(b), w(c), add(d) {}
    friend bool operator < (Eddge e1, Eddge e2) { return e1.w < e2.w; }
}E[2][maxE];
inline void init() { for(int i=0; i<=N; i++) root[i] = i; }
bool flag = false;
inline bool Kruskal()
{
    init(); MST_ans = 0;
    int i = 1, j = 1, bian = 0, u, v, white = 0;
    while(i <= line[0] || j <= line[1])
    {
        if(bian == N - 1) break;
        if(j > line[1] || (i <= line[0] && E[0][i].w + E[0][i].add <= E[1][j].w))
        {
            u = fid(E[0][i].u); v = fid(E[0][i].v);
            if(u != v)
            {
                MST_ans += E[0][i].w + E[0][i].add;
                root[u] = v;
                white++;
                bian++;
            }
            i++;
        }
        else
        {
            u = fid(E[1][j].u); v = fid(E[1][j].v);
            if(u != v)
            {
                MST_ans += E[1][j].w;
                root[u] = v;
                bian++;
            }
            j++;
        }
    }
    return white >= need;
}
int main()
{
    scanf("%d%d%d", &N, &M, &need);
    for(int i=1, u, v, w, op; i<=M; i++)
    {
        scanf("%d%d%d%d", &u, &v, &w, &op);
        E[op][++line[op]] = Eddge(u, v, w, 0);
    }
    sort(E[0] + 1, E[0] + line[0] + 1);
    sort(E[1] + 1, E[1] + line[1] + 1);
    int l = -100, r = 100, mid, ans = 0;
    while(l <= r)
    {
        mid = (l + r) / 2;
        for(int i=1; i<=line[0]; i++) E[0][i].add = mid;
        if(Kruskal())
        {
            l = mid + 1;
            ans = MST_ans - need * mid;
        }
        else
        {
            r = mid - 1;
        }
    }
    if(!flag) printf("%d\n", ans);
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tree【WQS二分+MST】 的相关文章

  • 东北大学acm第五周周赛

    include
  • [USACO06FEB]Steady Cow Assignment G【二分+最大流】

    题目链接 P2857 USACO06FEB Steady Cow Assignment G 有N头牛 B个牛棚 告诉你每头牛心里牛棚的座次 即哪个牛棚他最喜欢 哪个第2喜欢 哪个第3喜欢 等等 但牛棚容量一定 所以每头牛分配到的牛棚在该牛心
  • LeetCode-Python-1584. 连接所有点的最小费用(MST)

    给你一个points 数组 表示 2D 平面上的一些点 其中 points i xi yi 连接点 xi yi 和点 xj yj 的费用为它们之间的 曼哈顿距离 xi xj yi yj 其中 val 表示 val 的绝对值 请你返回将所有点
  • 图论进阶指南-银河(差分约束/DAG/tarjan)

    测评地址 题目大意 第一行给出两个整数N和M 之后M行 每行三个整数T A B 表示一对恒星 A B 之间的亮度关系 恒星的编号从1开始 如果T 1 说明A和B亮度相等 如果T 2 说明A的亮度小于B的亮度 如果T 3 说明A的亮度不小于B
  • Road Construction POJ - 3352(tarjan双连通缩点模板)

    题目描述 给一个无向连通图 至少添加几条边使得去掉图中任意一条边不改变图的连通性 即使得它变为边双连通图 include
  • hdu 5756:Boss Bo

    题目链接如下 Problem 5756 先用dfs确定每个节点的序号编号 并且可以获得每个节点可以包括的子树节点区间范围 再用线段树建立一棵树 在第一次建立的时候我们记录每个节点的深度 然后再进行一次dfs 这次dfs用来更新以不同节点为根
  • 图论17(Leetcode864.获取所有钥匙的最短路径)

    用二进制表示获得的钥匙 假设n 钥匙个数 000000000代表没有钥匙 0000000001代表有idx为1的钥匙 0000000011代表有idx 1 2的钥匙 这方法巧妙又复杂 代码 class Solution static int
  • 图的应用--Prim算法

    图的应用 Prim算法 Prim算法是一种基于顶点的贪心算法 从起始顶点出发 每次迭代选择当前可用的最小权值边 然后把边上依附的其他顶点加入最小生成树 prim算法可以称为 加点法 比较适合稠密图 算法思想 设G V E 是一个加权连通图
  • A*算法 解决(有环图)第k短路径长度(C++)

    算法竞赛 file author jUicE g2R qq 3406291309 彬 bin 必应 一个某双流一大学通信与信息专业大二在读 brief 一直在算法竞赛学习的路上 copyright 2023 9 COPYRIGHT 原创技术
  • 树形dp(例题)

    树的最长路径带权值 树的直径可能时红色的边 从上图可以看出 每次要两个变量存放以u为根 最长路径d1 和次长路径d2 那么整个树的最长路径就有可能是d1 d2 我们每次要返回以u为根的贯穿试的最长路径 给他的父节点判断使用如下图 inclu
  • 离散数学第一章总结

    离散数学第一章 1 公式类型 1 重言式 也是永真式 公式真值恒为1 2 矛盾式 永假式 真值恒为0 3 可满足式 不是矛盾式的就都是可满足式 重言式一定是可满足式 2 成真赋值与成假赋值 也叫成真指派与成假指派 一组原子的取值 真值指派
  • 最长公共上升子序列(LCIS)

    前置知识 LCS LIS 注意 刚开始看这个问题的时候 第一反应是先求出LCS再求出LCS的LIS 事实上这是有问题的 我们并不能保证这么求出的LCIS是最长的 比如下面这个例子 Example a 7 1 5 6 4 2 7 b 7 1
  • UVA-10603 倒水问题 题解答案代码 算法竞赛入门经典第二版

    GitHub jzplp aoapc UVA Answer 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 使用广度优先搜索和优先队列 如果找到最小的点则退出 找不到就遍历所有的情况 include
  • 图论算法<三>:判断有向图中是否有存在循环 ,以及环的个数和各个环中的元素

    1 目的 判断有向图中是否有存在循环 以及环的个数和各个环中的元素 2 示例效果 2 1 原始数据 路线起终点整理如下 共计12个顶点 19条边 起点 终点 1 最后的1代表起点终点是连通的 起点 终点 1 2 4 1 起点 终点 1 9
  • 【算法笔记】Prim算法

    定义 prim算法 图论中的一种算法 可在加权连通图里搜索最小生成树 由此算法搜索到的边子集所构成的树中 不但包括了连通图里的所有顶点 并且其所有边的权值之和最小 算法描述 输入 一个加权连通图 其中顶点集合为V 边集合为E 初始化 Vne
  • 1345:香甜的黄油(Dijkstra)---信息学奥赛一本通

    题目描述 农夫John发现做出全威斯康辛州最甜的黄油的方法 糖 把糖放在一片牧场上 他知道N 1 N 500 只奶牛会过来舔它 这样就能做出能卖好价钱的超甜黄油 当然 他将付出额外的费用在奶牛上 农夫John很狡猾 像以前的巴甫洛夫 他知道
  • hdu1827Summer Holiday【tarjan强连通分量解决最小联系费用】

    1A 撒花 这比买买买开心多了 思路 既然是强连通分量的题 很容易想到形成的东西是一坨一坨的 哈哈 然后如果某一坨入度为0 那么很不幸 这一坨只能直接被威士忌通知 至于具体通知这一坨中的哪一个 枚举一遍就知道了 最后把话费求和 感觉强连通分
  • 714阿里巴巴模拟面试

    介绍一下数据库分页 https www nowcoder com questionTerminal 3577280c810546658f06f19c01ff0345 给定一棵树 求出这棵树的直径 即两个节点距离的最大值 应该是左右子树遍历深
  • 数模培训第二周——图论模型

    图论中最短路算法与程序实现 图论中的最短路问题 包括无向图和有向图 是一个基本且常见的问题 主要的算法有Dijkstra算法和Floyd算法 Floyd算法 简介 Floyd Warshall算法 英语 Floyd Warshall alg
  • 860.染色法判定二分图

    二分图是指一个图中的所有顶点可以分为两部分 并且每条边连接的是属于不同部分的两个顶点 include

随机推荐

  • layui table 字体大小_layui table表格详解

    上次做table有些东西 忘记了 这次当作来个分析总结一下 跟大家共同学习 闲话不多说 直接上例子 代码 layuitable初始化代码 layui use table function var table layui table tabl
  • Https 公钥私钥交换过程

    记录一下Https 公钥私钥加密过程 对称加密 编 解码使用相同密钥的算法 一般是共享密钥 非对称加密 非对称加密算法需要两个密钥 公开密钥 publickey 简称公钥 和私有密钥 privatekey 简称私钥 公钥与私钥是一对 如果用
  • 滤波去噪和小波去噪

    原文 http zhidao baidu com linkurl 7vqgj2oQ4MacZxGLdJXM lTCDdW3TrY6hbeInWeW7NWgcCFjO8qHbbm0U8lONrAanc6BQR7WwJB0GRzgZXZQLK
  • 【云原生&Docker基础篇】Docker的安装与使用(适用于初学者)

    博客首页 派 大 星 欢迎关注 点赞 收藏 留言 本文由派大星原创编撰 系列专栏 Docker 云原生 本系列记录容器化技术的初次探险与深入思考历程 如有描述有误的地方还望诸佬不吝赐教 文章目录 Docker 是什么 Docker的优点 D
  • 机械硬盘分区 最佳性能方案

    原理 机械硬盘的通过磁头读写数据 由于角速度恒定 磁头越靠近外圈 扫描的扇区越多 读写速度越快 3个磁盘分区方案 假设 磁盘半径r 10 内层半径r1 2 5 中层半径r2 5 外层半径r3 7 5 内层面积 s1 r2xr2 r1xr1
  • Android APP 与STM32无线环境控制系统

    本系统为安卓APP的环境参数远程监控系统 以STM32F103单片机作为本设计的中控中心 结合物联网技术 以Android智能手机作为远程控制的客户端 通过8266 WiFi模块实现环境监控系统硬件与Android手机的交互 环境参数的反馈
  • Android学习——MultiAutoCompleteTextView组件

    1 编辑activity main xml文件 添加MultiAutoCompleteTextView组件
  • unity3d 5 GUI Texture不显示原因分析

    Unity5添加GUI组件game视图无显示可能原因如下 1 Transform position应该为0 1之间为屏幕占比 2 scale大小比例 3 如果用系统自带的第一人称控制器 组件中不包括GUI层 因此应该在添加组件中Render
  • WSL2使用cuda

    在微软最新发布的 Windows Insider 预览版本中 WSL2 获得了 GPU 计算支持 这意味着 Linux 二进制文件可以利用 GPU 资源 在 WSL 中进行机器学习 AI 开发或是数据科学等工作 微软在今年五月份的 Buil
  • Web安全基础-SQL MySQL

    文章目录 SQL简介 数据库简介 SQL语句 SELECT 语句 INSERT INTO 语句 Delete语句 Update 语句 Order by 语句 Where 语句 运算符 Limit 控制输出 MySQL注释符 MySQL基础
  • IntelliJ IDEA搭建一个Spring boot项目运行“Hello World”

    目录 IntelliJ IDEA搭建一个Spring boot项目 Hello World 创建新项目 1 Create New Project 2 创建Spring Boot项目 3 项目命名 4 搭建Web项目 5 选择项目目录 6 导
  • VMware tools详细教程 解决安装失败等问题

    1 打开虚拟机VMware Workstation 启动Ubuntu系统 菜单栏 虚拟机 安装VMware Tools 不启动Ubuntu系统是无法点击 安装VMware Tools 选项的 如下图 必须在虚拟机内部进行安装 2 如果弹出如
  • 创建安装程序Visual Studio Installer

    1 在vs2010 选择 新建项目 其他项目类型 Visual Studio Installer 安装项目 命名为 Setup1 这是在VS2010中将有三个文件夹 1 应用程序文件夹 表示要安装的应用程序需要添加的文件 2 用户的 程序
  • Redis的启动方式三种

    Redis的启动方式三种 启动一个 进入到redis中的src目录下 在控制台输入指令 redis server 注意 这样启动默认端口是 6379 进入客户端输入 redis cli 查看进程 杀死进程 指定端口启动redis服务 red
  • 如果使用Vue3.0实现一个 Modal,你会怎么进行设计?

    一 组件设计 组件就是把图形 非图形的各种逻辑均抽象为一个统一的概念 组件 来实现开发的模式 现在有一个场景 点击新增与编辑都弹框出来进行填写 功能上大同小异 可能只是标题内容或者是显示的主体内容稍微不同 这时候就没必要写两个组件 只需要根
  • mysql thread conn_Mysql thread 与 OS thread

    gt 欢迎阅读 陈同学博客原文 本文作为 Mysql插入2 6亿条垃圾数据后会发生什么 手工重现Mysql插入的 2 6亿 垃圾数据 的续篇 初始目的是想看看kill掉执行中的事务对应的os thread之后会发生什么 同时学习下mysql
  • apt-get简介

    在Ubuntu系统中 经常要用到apt get install指令来安装软件 由于常常需要root权限来操作 所以搭配sudo食用口感更佳 apt get指令对于安装 卸载 升级软件提供一条龙服务 对比于源码安装 实在是业界良心 源码安装
  • [Python系列-10]:Python之人工智能 - 基本工具 -4- 数组与矩阵数学工具Numpy

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119281620 目录 第1章
  • 【毕业设计_课程设计】基于协同过滤算法的个性化推荐系统(源码+论文)

    文章目录 0 项目说明 1 研究目的 2 研究方法 3 系统设计 3 1 前台模块 3 1 1 首页 3 1 2 个人中心 3 1 3 发布者中心 3 2 后台模块 3 2 1 首页 3 2 2 新闻管理 4 研究结论 5 界面展示 6 论
  • tree【WQS二分+MST】

    题目链接 洛谷 精确涉及到了WQS二分 BZOJ 2654 不推荐 个人不推荐做BZOJ2654的这道题 因为那道题可以水过去 不用WQS二分也是可以的 可以直接二分答案 显然是没有这个好的 先在这里讲一下什么是WQS二分吧 也是从网上看来