题目描述

给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有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. get 和 post 的区别

    1. get 提交的信息显示在地址栏中 post 提交的信息不显示在地址栏中 2. get 对于敏感数据信息不安全,因为信息显示在地址栏中 post 对于敏感数据安全 3. get 不支持大数据量请求 ...

  2. IDEA自定义liveTemplates(方法模板、类模板)

    IDEA自定义liveTemplates(方法模板.类模板) 前言,搞这个模板有何意义? 降低大家写方法注释的成本,统一风格.有时候不是开发同学不爱写注释,而是没有合适的载体和空间. IDEA模板设置 ...

  3. tcp协议传输中的粘包问题

    什么是粘包问题 tcp是流体协议. 其nagle算法会将数据量较小. 并且发送间隔时间较短的多个数据包合并为一个发送. 网络传输的时候是一段一段字节流的发送. 在接收方看来根本不知道字节流从何开始. ...

  4. 2021年5月15日海外 Meetup 演讲内容分享

    北京时间 2021 年 5 月 16 日 05:00-08:00 我们与Apache ShardingSphere 联合举办了第一场海外Meetup,感谢各位小伙伴的参与,让本次活动圆满结束. 同时我 ...

  5. Redis 06 哈希

    参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 哈希就是 ke ...

  6. Word 分栏符怎么使用

    如果你使用栏来设置文档格式(如在某些新闻稿布局中),则文本将自动从一栏排列到另一栏.可以插入你自己的分栏符,以更好地控制文档格式. 单击"布局"选项卡--"页面设置&qu ...

  7. 如何免费申请js.org二级域名

    最近看到很多人都去申请了js.org的域名,我就来写个教程吧! (本教程只注重于申请域名,而不是如何使用Github) 看看成品:https://butterfly.js.org/ 官网是这么写的: ...

  8. 网站制作工具之EditPlus的使用

    这里分享网站制作教程所使用到的软件,我个人开发使用的是EditPlus和Dreamweaver这两款软件.在百度搜索一下这两个软件,安装好后就可以使用了. EditPlus的使用方法 EditPlus ...

  9. 高颜值,类似Fliqlo的翻页时钟-BdTab新标签页插件组件

    起因: 很多用户在使用BdTab插件时,反馈说希望添加一个时钟的功能, 而BdTab又是组件模块化的插件,于是在空余时间就用html+js+css写了一款高颜值的分页时钟 源码如下: 需要其他网页组件 ...

  10. Linux软件包常见的几种下载、安装方法

    在线源下载和安装 如果服务器是处于在线状态,在使用默认下载源是外国的情况下,安装更新软件包往往会比较痛苦的存在,下载了许久来一个超时就gg了.国内有许多镜像源,完美的解决了这个问题. 对于rpm系列的 ...