BZOJ2654 tree (wqs二分)
题目描述
那么问题来了,如果说当前白边加上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二分)的更多相关文章
- [BZOJ2654]tree(二分+MST)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2654 分析:此题很奇葩,我们可以给所有白边加上一个权值mid,那么在求得的MST中白边 ...
- BZOJ2654:tree(最小生成树,二分)
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- BZOJ2654 tree 【二分 + 最小生成树】
题目 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入格式 第一行V,E,need分别表示点数,边数和需要的白色边数. 接下来E行, ...
- [BZOJ2654] tree (kruskal & 二分答案)
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- [BZOJ2654]tree(二分+Kruskal)
2654: tree Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 2733 Solved: 1124[Submit][Status][Discus ...
- Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...
- p2619 [国家集训队2]Tree I [wqs二分学习]
分析 https://www.cnblogs.com/CreeperLKF/p/9045491.html 反正这个博客看起来很nb就对了 但是不知道他在说啥 实际上wqs二分就是原来的值dp[x]表示 ...
- 关于WQS二分算法以及其一个细节证明
应用分析 它的作用就是题目给了一个选物品的限制条件,要求刚好选$m$个,让你最大化(最小化)权值, 然后其特点就是当选的物品越多的时候权值越大(越小). 算法分析 我们先不考虑物品限制条件, 假定我们 ...
- WQS二分题集
WQS二分,一种优化一类特殊DP的方法. 很多最优化问题都是形如“一堆物品,取与不取之间有限制.现在规定只取k个,最大/小化总收益”. 这类问题最自然的想法是:设f[i][j]表示前i个取j个的最大收 ...
- [CSP-S模拟测试]:赤(red)(WQS二分+DP)
题目传送门(内部题38) 输入格式 每个输入文件包含多组测试数据.选手应当处理到文件结束($EOF$) 每一组数据包括$3$行. 第$1$行包含三个正整数$n,a,b$,表示有$n$只猫,$gyz$有 ...
随机推荐
- IP地址和端口号
IP地址 IP地址:指互联网协议地址(Internet Protocol Address),俗称IP.IP地址用来给一个网络中的计算机设备做唯一的编号.加入我们吧"个人电脑"比作一 ...
- 项目开发中Maven的单向依赖-2022新项目
一.业务场景 工作多年,在真实的项目开发中经常会遇到将一个项目拆分成多个工程的情况,比如将一个真实的项目拆分成controller层,service层, dao层,common公共服务层等等.这样拆分 ...
- JS for in / foreach / for of 超简单对照解释
for in 可以遍历数组/对象/字符串/enumerable对象,得到的是索引,遍历对象时可以写这样 obj[index] 代表对象当前的属性foreach 只能遍历数组,不能遍历字符串.对象for ...
- 手把手教你定位线上MySQL慢查询问题,包教包会
1. 慢查询日志的作用 慢查询日志默认不开启,建议手动开启,方便我们定位线上问题. 执行时间超过阈值的SQL会被写入到慢查询日志当中,这样可以帮助我们记录执行时间过长的SQL语句,定位线上慢SQL问题 ...
- 什么是云计算?云计算三种模式Sass、Paas、Iaas
云计算 云计算的"云"指的是计算机网络(一般指的是 Internet),"计算"指的是多个计算机共同计算巨大的数据的过程.通过云计算平台把任务分解成一个个小的任 ...
- redis-string类型命令
一.APPEND key value 如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾. 如果 key 不存在,那么它将首先创建一个空字符串的ke ...
- CF453C Little Pony and Summer Sun Celebration(构造、贪心(?))
CF453C Little Pony and Summer Sun Celebration 题解 这道题要求输出任意解,并且路径长度不超过4n就行,所以给了我们乱搞构造的机会. 我这里给出一种构造思路 ...
- MySQL插入重复数据
MySQL中批量insert into时防止更新插入重复数据去重的方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法 方案一:使用ignore关键字 ...
- 《Java编程思想》读书笔记(五)
前言:本文是<Java编程思想>读书笔记系列的最后一章,本章的内容很多,需要细读慢慢去理解,文中的示例最好在自己电脑上多运行几次,相关示例完整代码放在码云上了,码云地址:https://g ...
- maven执行跳过测试
-Dmaven.test.skip=true 例子 mvn clean install -Dmaven.test.skip=true