2021杭电多校第三场-Road Discount-wqs二分+最小生成树

2023-10-27

Description
There are n cities in Byteland, labeled by 1 to n. The Transport Construction Authority of Byteland is planning to construct n−1 bidirectional roads among these cities such that every pair of different cities are connected by these roads directly or indirectly.

The engineering company has offered m possible candidate roads to construct. The i-th candidate road will cost ci dollars, and if it is finally constructed, there will be a road connecting the ui-th city and the vi-th city directly. Fortunately, each road has its discounted price, the i-th of which is di.

The Transport Construction Authority of Byteland can buy at most k roads at their discounted prices. Please write a program to help the Transport Construction Authority find the cheapest solution for k=0,1,2,…,n−1.

Input
The first line contains a single integer T (1≤T≤10), the number of test cases. For each test case:

The first line contains two integers n and m (2≤n≤1000, n−1≤m≤200000), denoting the number of cities and the number of candidate roads.

Each of the following m lines contains four integers ui,vi,ci and di (1≤ui,vi≤n, ui≠vi, 1≤di≤ci≤1000), describing a candidate road.

Output
For each test case, output n lines, the i-th (1≤i≤n) of which containing an integer, denoting the cheapest total cost to construct n−1 roads when k=i−1.

It is guaranteed that the answer always exists.

Samples
Input Copy

1
5 6
1 2 1 1
2 3 2 1
2 4 3 2
2 5 4 3
1 3 5 3
4 5 6 1

Output

10
7
6
5
5

给出一个n个点的图,有m条边,每条边有两个价值属性,分别是原始价值和折扣价值,问至少含有i(1 <= i <= n) 条折扣边的最小生成树

官方题解:
在这里插入图片描述
:::
将原始价格的边看作是白边,将折扣价格的边看作是黑边,对于每一个输入,黑边和白边连的都是同样的两个端点,所以说同一条边是不可能被选择两次的,所以说问题就相当于是求含有k条折扣边(黑边)的最小生成树问题
设f[x] 是正好包含x条黑边的最小生成树的权值之和,然后这个函数一定是一个上凸的函数,其实这里有wqs二分的意思
wqs是对一个上(上/下)凸的函数二分斜率求出最优解的过程,本题可以说是用到了其思想/doge
考虑两种极端的情况,全选择白边(选择0条黑边)和全选择黑边的两种情形,此时我们对上述情况分别求最小生成树,然后重构输入的两种边,因为我们在求最小生成树的过程当中,将没有用到的非树边去掉是不会影响答案的,将没有用到的非树边去掉也是可以减去一部分复杂度的,经过这样的操作,白边和黑边只会剩下n-1

然后就很轻松的解决本题啦

#define PII pair<int, int>
int fa[maxn];
int n, m;
PII save[2007];
struct node {
    int u, v, w;
    friend bool operator<(node a, node b) {
        return a.w < b.w;
    }
} a[maxn], b[maxn];
int find(int x) {
    if (x == fa[x])
        return x;
    else
        return fa[x] = find(fa[x]);
}
bool Union(int x, int y) {
    int fax = find(x);
    int fay = find(y);
    if (fax == fay) return false;
    fa[fax] = fay;
    return true;
}
PII get(int x) {
    for (int i = 1; i <= n; i++) fa[i] = i;
    int A = 1, B = 1;
    int tot = 0, black = 0;
    while (A < n && B < n) {
        if (a[A].w <= b[B].w + x) {
            if (Union(a[A].u, a[A].v)) tot += a[A].w;
            ++A;
        } else {
            if (Union(b[B].u, b[B].v)) tot += b[B].w + x, black++;
            ++B;
        }
    }
    while (A < n) {
        if (Union(a[A].u, a[A].v)) tot += a[A].w;
        ++A;
    }
    while (B < n) {
        if (Union(b[B].u, b[B].v)) tot += b[B].w + x, black++;
        ++B;
    }
    return PII{tot, black};
}
int main() {
    int _ = read;
    while (_--) {
        n = read, m = read;
        // memset(save,-1,sizeof save);
        for (int i = 1; i <= m; i++) {
            b[i].u = a[i].u = read;
            b[i].v = a[i].v = read;
            a[i].w = read;
            b[i].w = read;
        }
        sort(a + 1, a + 1 + m);
        for (int i = 1; i <= n; i++) fa[i] = i;
        for (int i = 1, t = 0; i <= m; i++) {
            if (Union(a[i].u, a[i].v)) a[++t] = a[i];
        }
        sort(b + 1, b + 1 + m);
        for (int i = 1; i <= n; i++) fa[i] = i;
        for (int i = 1, t = 0; i <= m; i++) {
            if (Union(b[i].u, b[i].v)) b[++t] = b[i];
        }
        for (int i = -1000; i <= 1000; i++) {
            save[1000 + i] = get(i);
        }
        // debug(save[1000].first);
        // debug(save[1000].second);
        for (int i = 0; i < n; i++) {
            int flag = 0;
            for (int j = -1000; j <= 1000; j++) {
                if (save[j + 1000].second <= i) {
                    printf("%d\n", save[1000 + j].first - i * j);
                    flag = 1;
                    break;
                }
            }
            if (!flag) puts("-1");
        }
    }
    return 0;
}

代码意思讲解:

bool Union(int x, int y) {
    int fax = find(x);
    int fay = find(y);
    if (fax == fay) return false;
    fa[fax] = fay;
    return true;
}

如果两个点在求最小生成树的过程中用到了,那么就返回true,否则返回false

get函数是求出将黑色的边权加上一个值x之后的一个花费,我们会这个函数处理出x=-1000->1000的所有情况,然后将信息储存在save中,然后在询问的时候,直接遍历save集合,遇见满足情况的便直接输出,否则输出-1,虽然没有-1的情况/doge

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

2021杭电多校第三场-Road Discount-wqs二分+最小生成树 的相关文章

  • 蓝桥杯2020年第十一届国赛真题-重复字符串

    说在前面 本题的标程是存在问题的 下面会分析标程与正确程序 题目 题目连接 题解 思维吧 整体思路 将字符串分割成k段 假设每段m个字符 我们统计每段相同位置的每种字符出现的次数 每段都统计上后 每个位置 0 m 1 都取出现次数最多的字符
  • 2017年蓝桥杯B组C/C++省赛-K倍区间

    题目 题解 思维 暴力的话是会超时的 但也可以骗点分 采用差分数组暴力 讲一下AC思路 统计出来每个前缀和取模 k k k后结果的个数 比如 c n t
  • UPC-混合训练第十五场

    gift 题目描述 战争结束 A国和B国的元首决定两国友好相处 于是城市之间就有互相送礼的情况 参与这次相互协助计划中有n个A国的城市和m个B国的城市 作为A国的重臣 小Q了解到每一个A国的城市送出了ai份礼物 B国的城市收到了bi份礼物
  • 2021-07-21训练日记upc联通数(思维)

    A 联通数 题目描述 数学高手小G最近发现了一种新型的数 他首先在草稿纸写下任意长度的数字串kkkkkkkkkkk 1 k 9 并在其中间添加加号 且相邻两个加号之间至少含有两个数字k 默认数字串第一个数字前与最后一个数字后也有两个加号 然
  • L2-001 紧急救援 (25 分)

    题目 题目链接 题解 最短路 扩展 算是朴素Dijkstra模板吧 Dijkstra算法 额外加上记录路径 记录到达此处的最短距离 记录以最短距离到达此处的最多人数 更新方式 假设未确定距离的点集中的点t距离已确定距离的点集最近 以t对其他
  • Tree with Maximum Cost---CF1092F 树上DP

    F Tree with Maximum Cost time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstand
  • APAC 2013 部分题解

    目录 A The Alphabet Sticker C Increasing Shortest Path D Cup of Cowards E Balloons Colors F NASSA s Robot G The Stones Gam
  • [Atcoder ABC222] F - Expensive Expense

    Time Limit 4 sec Memory Limit 1024 MB Score 500 points Problem Statement The Kingdom of AtCoder is composed of N N N tow
  • HDU-2063过山车

    题目链接 http acm hdu edu cn showproblem php pid 2063 解题思路 匈牙利算法 二分图模板 代码 include
  • L3-005 垃圾箱分布 (30 分)

    题目 题目链接 题解 对每个垃圾箱进行一次队列优化的Dijskra 每算出一个垃圾箱到其余各个居民点的最短距离后 计算这些距离中的最大距离 最短距离 如果最大距离大于要求的距离则直接忽略这个位置放垃圾桶的情况 否则 如果最短距离小于已经记录
  • Xor Sum 2二分/尺取 区间异或和等于区间和的方案数

    题目描述 There is an integer sequence A of length N Find the number of the pairs of integers l and r 1 l r N that satisfy th
  • [Nowcoder

    题目描述 There s a new art installation in town and it inspires you to play a childish game The art installation consists of
  • [洛谷] [NOIP2018 提高组] 旅行 加强版 - 基环树

    题目链接 https www luogu com cn problem P5049 题目描述 小 Y 是一个爱好旅行的 OIer 她来到 X 国 打算将各个城市都玩一遍 小Y了解到 X国的 n 个城市之间有 m 条双向道路 每条双向道路连接
  • [leetcode] 2039. 网络空闲的时刻

    题目链接 题意 给定一张n个点不含重边的无向图 点的编号从0开始到n 1 两点之间如果有连边 可以认为耗时为1秒 1 gt n 1的点都需要向0号点发送消息 从第0秒开始 在0号收到消息之后 会回复消息 从第一秒开始 如果1 gt n 1号
  • 蓝桥杯2019年第十届省赛真题-Fibonacci 数列与黄金分割

    题目 题目链接 题解 我未曾设想的道路 我居然以为是高精度的矩阵快速幂 差点心态崩了 直接看了题解 1 50 打个表 发现到20 小数点后八位就不变了 所以 解决 代码 include
  • [UVA1364

    评测地址 网址1 网址2 题目描述 题意 给出n位骑士 然后有m个关系 每个关系以格式 a b a b a b给出 表达骑士 a a
  • Early Orders单调栈

    链接 题目描述 You are given a list of integers n and a number k It is guaranteed that each i from 1 to k appears in the list a
  • CodeForces 1025C Plasticine zebra

    题目大意 题目链接 给定一个由w和b组成的字符串 可以操作任意次 每次操作 0次或多次 可以将字符串分割成左右两个子串 左 右侧子串均前后颠倒 问最终字符串中最多可以有多少个w和b交错 w和b无所谓顺序 题解 构造 比较好想 总述 当最左端
  • Educational Codeforces Round 98 (Rated for Div. 2)B-Toy Blocks

    B Toy Blocks time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output Y
  • L3-014 周游世界 (30 分)

    题目 题目链接 题解 DFS 采用的数据结构 vector 索引为起点 值为 终点 起点公司编号 当然你也可以保存终点公司编号 但是代码中的语句就需要改一下了 dfs 传入四个信息 当前节点 遇到的节点数 换乘数 当前节点所在公司的编号 由

随机推荐

  • 基于springboot实现的https单向认证和双向认证(java生成证书)

    1 java生成HTTPS证书 既然是双向验证 就需要双方的密钥 我们服务端称为localhost 而客户端称为client 需要生成双方的密钥文件 并把对方的cert导入自己的密钥文件里 整个过程如下 注意 密码统一为 changeit
  • python使用pd.read_csv(),出现错误UnicodeDecodeError: ‘utf-8‘ codec can‘t decode ......

    首先说一下这个原因 所读取的csv文件的编码方式不是utf 8 然后现在指定encoding UTF 8 会出现以上问题 一 查看你的csv文件时什么编码方式 使用记事本打开csv文件 红框所示即csv文件的编码方式 现在你的csv文件的编
  • [春秋云镜]CVE-2021-41402

    声明 中所涉及的技术 思路和 具仅供以安全为 的的学习交流使 任何 不得将其 于 法 途以及盈利等 的 否则后果 承担 所有渗透都需获取授权 靶场介绍 flatCore CMS v2 0 8 存在后台任意代码执行漏洞 春秋云镜开启靶场 ht
  • org-mode报错:export html等格式时,错误args out of range

    错误概述 参数超出范围 解决过程 相关命令没有任何改动 原因 org的内容有问题 当前遇到的是表格写法 不符合org mode的规则
  • Linux下保存的SVN帐号及密码

    做个笔记备忘 Linux下SVN帐号和密码 如果有保存的话 大多是明文保存在 subversion auth svn simple的 因此如果服务器帐号和密码被人知道 并且你有在服务器上使用过或者还保存过密码 那么就帐号和密码就很容易被人一
  • cocos2dx使用TiledMap创建斜45度地图场景

    做游戏 场景是一个很重要的部分 如果缺少这一步 很难做出好的游戏 对于cocos2dx来说 有很多2D的地图编辑器可以用 效果都还可以 其中Tiled是支持的比较好的 它支持Tiled编辑出来的几种模式 比如正常 45度地图等 如果要做小型
  • vim的目录树插件NERDtree的安装

    下载 https github com preservim nerdtree 上面是NERDTree插件的下载链接 在github上下载即可 将下载的文件的解压 并通过虚拟机的共享文件夹共享到虚拟机 将共享的文件 复制到 vim 目录下 如
  • USB Type C 接口引脚详解

    1 Type C 接口特点 Type C 是一组对称的连接器 在使用的过程中不需要如同使用 USBA MinUSB MicroUSB 那样来辨别接口方向 其次能够承受较高的功率所以可以支持高达 100W 的功率 所以使用该接口可以更好的支持
  • 骁龙435和骁龙625处理器哪个好?

    2016年2月 美国高通公司推出了三款中低端芯片 它们分别是骁龙425 骁龙435 骁龙625 这三款芯片配备更快的LTE网络基带 可实现全网通 骁龙425市场表现比较平淡 而骁龙625是目前较为热销的手机芯片 其中骁龙435也逐渐在市场活
  • Linux文件编程常用函数详解——wait()函数

    函数原型和头文件 include
  • 【JavaScript】判断对象是否有某个key

    1 in方法 实例属性 继承属性 key in obj 结果为false 表示不包含 否则表示包含 2 hasOwnProperty 实例属性 obj hasOwnProperty key obj表示对象 结果为false表示不包含 否则表
  • 充换电企业开迈斯低成本提升线上应用稳定性的最佳实践

    开迈斯新能源科技有限公司于 2019 年 5 月 16 日成立 目前合资股东分别为大众汽车 中国 投资有限公司 中国第一汽车股份有限公司 一汽 大众汽车有限公司 增资扩股将在取得适当监督 包括反垄断 审批后完成 万帮数字能源股份有限公司和安
  • 1.4秒到0.4秒-2行代码让JS加载耗时减少67%

    大厂技术 高级前端 Node进阶 点击上方 程序员成长指北 关注公众号 回复1 加入高级Node交流群 前言 大家好 我是考拉 资源优先级优化效果示例 png 仅需2行代码 就能实现上图中的优化效果 让JS文件的加载耗时从1 4秒减少到0
  • 七:微服务调用组件Feign

    目录 JAVA 项目中如何实现接口调用 1 什么是Feign 1 1 优势 1 2 Feign的设计架构 1 3 Ribbon Feign对比 1 4 Feign单独使用 2 Spring Cloud Alibaba快速整合Feign 3
  • 获取kafka队列中待消费Lag

    获取kafka中消费者某个topic主题待消费数据量 import java util ArrayList import java util HashMap import java util List import java util Ma
  • Invalid content was found starting with element ‘{“http://maven.apache.org/POM/4.0.0“:dependency}‘.

    在maven项目中运行时出现如下错误 点击上面的项目名 点击链接进入到报错的文件中 一般这种报错就是你的 Invalid content was found starting with element http maven apache o
  • java web项目中连接mysql数据库,javaweb之eclipse工程连接mysql数据库

    javaweb之eclipse工程连接mysql数据库 准备工作 1 在mysql官网下载mysqlconnection的jar包 输入网址 mysql com 点击DOWNLOADS 下拉选择MySQL Community GPL Dow
  • 入坑爬虫(六)某招聘网站信息采集

    前面的章节中 我们说到了如何发送发送 对应的 回顾之前的爬虫流程 在发送完请求之后 能够获取响应 这个时候就需要从响应中提取数据了 1 爬虫中数据的分类 在爬虫爬取到的数据中有很多不同类型的数据 我们需要了解数据的不同类型来规律的提取和解析
  • ADB简介

    Google官方网页 https developer android com studio command line adb html hl zh cn 对ADB的介绍在国内经常打不开 为了便于查看 这里从此网页中摘录了些经常使用到的内容
  • 2021杭电多校第三场-Road Discount-wqs二分+最小生成树

    Description There are n cities in Byteland labeled by 1 to n The Transport Construction Authority of Byteland is plannin