题目描述

给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。
题目保证有解。
 
一个最小生成树问题,但是我们要选need条白边,我们用g(i)表示选取i条白边的最优方案(生成树的权值最小),那么可以大致猜出g(i)是关于i的一个下凸函数,可以发现斜率k是有单调性的,我们二分这个斜率k,相当于给每条白边的权值加上一个k,统计数量use,如果use>=need,说明k小了,要增大,同理,use<need,要减小k。

那么问题来了,如果说当前白边加上mid后,白边条数use>need了,如果加上mid+1后,use<need了要怎么办?

题目中说到了:保证有解,所以出现上述情况时一定有黑边==白边的边权

所以我们只需要把一条黑边换成白边就好,即我们排序时如果黑边权值等于白边,则白边优先。

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 50001
4 #define M 100001
5 int n,m,k;
6 struct node{
7 int u,v,w,c;
8 }e[M];
9 int use,sum,fa[N];
10 bool cmp(node a,node b){
11 if(a.w!=b.w) return a.w<b.w;
12 return a.c<b.c;//黑边白边权值一样,优先选白边
13 }
14 int find(int x){
15 return fa[x]==x?x:fa[x]=find(fa[x]);
16 }
17 void check(int x){
18 for(int i=1;i<=m;i++)
19 if(e[i].c==0) e[i].w+=x;//白边加权值
20 sort(e+1,e+m+1,cmp);
21 for(int i=1;i<=n;i++) fa[i]=i;
22 int now=0,fu,fv,j=1;
23 use=0,sum=0;
24 while(now!=n-1){
25 fu=find(e[j].u);fv=find(e[j].v);
26 if(fu!=fv){
27 now++;
28 fa[fu]=fv;
29 if(e[j].c==0) ++use;//统计使用的白边数量
30 sum+=e[j].w;
31 }
32 ++j;
33 }
34 for(int i=1;i<=m;i++)
35 if(e[i].c==0) e[i].w-=x;//还原
36 }
37
38 int main()
39 {
40 scanf("%d%d%d",&n,&m,&k);
41 for(int i=1;i<=m;i++){
42 scanf("%d%d%d%d",&e[i].u,&e[i].v,&e[i].w,&e[i].c);
43 ++e[i].u;++e[i].v;//题目是编号从0开始,要+1
44 }
45 int l=-101,r=101,mid,ans;//值域[1,100];
46 while(l<=r){
47 mid=l+r>>1;check(mid);
48 if(use>=k){
49 ans=sum-k*mid;
50 l=mid+1;
51 }
52 else r=mid-1;
53 }
54 cout<<ans;
55 return 0;
56 }

BZOJ2654 tree (wqs二分)的更多相关文章

  1. [BZOJ2654]tree(二分+MST)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2654 分析:此题很奇葩,我们可以给所有白边加上一个权值mid,那么在求得的MST中白边 ...

  2. BZOJ2654:tree(最小生成树,二分)

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...

  3. BZOJ2654 tree 【二分 + 最小生成树】

    题目 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入格式 第一行V,E,need分别表示点数,边数和需要的白色边数. 接下来E行, ...

  4. [BZOJ2654] tree (kruskal & 二分答案)

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...

  5. [BZOJ2654]tree(二分+Kruskal)

    2654: tree Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 2733  Solved: 1124[Submit][Status][Discus ...

  6. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  7. p2619 [国家集训队2]Tree I [wqs二分学习]

    分析 https://www.cnblogs.com/CreeperLKF/p/9045491.html 反正这个博客看起来很nb就对了 但是不知道他在说啥 实际上wqs二分就是原来的值dp[x]表示 ...

  8. 关于WQS二分算法以及其一个细节证明

    应用分析 它的作用就是题目给了一个选物品的限制条件,要求刚好选$m$个,让你最大化(最小化)权值, 然后其特点就是当选的物品越多的时候权值越大(越小). 算法分析 我们先不考虑物品限制条件, 假定我们 ...

  9. WQS二分题集

    WQS二分,一种优化一类特殊DP的方法. 很多最优化问题都是形如“一堆物品,取与不取之间有限制.现在规定只取k个,最大/小化总收益”. 这类问题最自然的想法是:设f[i][j]表示前i个取j个的最大收 ...

  10. [CSP-S模拟测试]:赤(red)(WQS二分+DP)

    题目传送门(内部题38) 输入格式 每个输入文件包含多组测试数据.选手应当处理到文件结束($EOF$) 每一组数据包括$3$行. 第$1$行包含三个正整数$n,a,b$,表示有$n$只猫,$gyz$有 ...

随机推荐

  1. IP地址和端口号

    IP地址 IP地址:指互联网协议地址(Internet Protocol Address),俗称IP.IP地址用来给一个网络中的计算机设备做唯一的编号.加入我们吧"个人电脑"比作一 ...

  2. 项目开发中Maven的单向依赖-2022新项目

    一.业务场景 工作多年,在真实的项目开发中经常会遇到将一个项目拆分成多个工程的情况,比如将一个真实的项目拆分成controller层,service层, dao层,common公共服务层等等.这样拆分 ...

  3. JS for in / foreach / for of 超简单对照解释

    for in 可以遍历数组/对象/字符串/enumerable对象,得到的是索引,遍历对象时可以写这样 obj[index] 代表对象当前的属性foreach 只能遍历数组,不能遍历字符串.对象for ...

  4. 手把手教你定位线上MySQL慢查询问题,包教包会

    1. 慢查询日志的作用 慢查询日志默认不开启,建议手动开启,方便我们定位线上问题. 执行时间超过阈值的SQL会被写入到慢查询日志当中,这样可以帮助我们记录执行时间过长的SQL语句,定位线上慢SQL问题 ...

  5. 什么是云计算?云计算三种模式Sass、Paas、Iaas

    云计算 云计算的"云"指的是计算机网络(一般指的是 Internet),"计算"指的是多个计算机共同计算巨大的数据的过程.通过云计算平台把任务分解成一个个小的任 ...

  6. redis-string类型命令

    一.APPEND key value 如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾. 如果 key 不存在,那么它将首先创建一个空字符串的ke ...

  7. CF453C Little Pony and Summer Sun Celebration(构造、贪心(?))

    CF453C Little Pony and Summer Sun Celebration 题解 这道题要求输出任意解,并且路径长度不超过4n就行,所以给了我们乱搞构造的机会. 我这里给出一种构造思路 ...

  8. MySQL插入重复数据

    MySQL中批量insert into时防止更新插入重复数据去重的方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法 方案一:使用ignore关键字 ...

  9. 《Java编程思想》读书笔记(五)

    前言:本文是<Java编程思想>读书笔记系列的最后一章,本章的内容很多,需要细读慢慢去理解,文中的示例最好在自己电脑上多运行几次,相关示例完整代码放在码云上了,码云地址:https://g ...

  10. maven执行跳过测试

    -Dmaven.test.skip=true 例子 mvn clean install -Dmaven.test.skip=true