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$有 ...
随机推荐
- 异常分类和异常的产生过程解析和Objects非空判断
java.lang.Throwable类是java语言中所有错误的异常的超类. Exception:编译期异常,进行编译(写代码)java程序出现的问题 RuntimeExeption:运行期异常,j ...
- 题解【AtCoder - CODE FESTIVAL 2017 qual B - D - 101 to 010】
题目:https://atcoder.jp/contests/code-festival-2017-qualb/tasks/code_festival_2017_qualb_d 题意:给一个 01 串 ...
- MultiSpehere类定义
再等等,把这个定义完了,就到了我们展示代码环节了. 这个类是多个球体的碰撞检测的,其实就是单个球体的改装版本,基本一摸一样的. 类定义: #pragma once #ifndef __MULTISPH ...
- How to code like a pro in 2022 and avoid If-Else
在浏览文章的时候发现了一篇叙述有关if-else语句的文章,这篇文章作者是Thai Tran,他原文是用英语写的,然后看着文章浅显易懂,便尝试翻译成汉语.如有不妥还望指出. 原文链接:https:// ...
- 结束语句之 continue
C 语言自学之 continue Dome1:计算1到20之间不能被3整除的数字之和. 运算结果为: sum=147 1 #include<stdio.h> 2 ...
- 官宣!DolphinScheduler 毕业成为 Apache 软件基金会顶级项目
全球最大的开源软件基金会 Apache 软件基金会(以下简称 Apache)于北京时间 2021年4月9日在官方渠道宣布Apache DolphinScheduler 毕业成为Apache顶级项目.这 ...
- 如何在win下安装dlib的whl文件(Anaconda方式)
问题描述 由于作业需要用到dlib的人脸检测函数,所以尝试安装了一下dlib.顺便贴上dlib的下载网址dlib下载. 但当我直接输入pip install dlib-19.7.0-cp36-cp36 ...
- SPI:Java的高可扩展利器
摘要:JAVA SPI,基于接口的编程+策略模式+配置文件的动态加载机制. 本文分享自华为云社区<一文讲透Java核心技术之高可扩展利器SPI>,作者: 冰 河. SPI的概念 JAVA ...
- k8s vs k3s: 差异解析
Kubernetes无疑是容器编排领域的领头羊.但目前,我们看到K3s或轻量级的Kubernetes发行版,轻巧.高效.快速,占用空间极小.鉴于目前企业对于在生产环境中使用K3s还是K8s感到纠结.我 ...
- FormData 和表单元素(form)的区别
Form 元素 <form>元素表示文档中的一个区域,此区域包含交互控件,用于向 Web 服务器提交信息(文件.字符).下面称之为表单元素或表单. 要向 Web 服务器提交信息,我们必须要 ...