2654: tree

Time Limit: 30 Sec  Memory Limit: 512 MB
Submit: 610  Solved: 225
[Submit][Status][Discuss]

Description

  给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。
  题目保证有解。

Input

  第一行V,E,need分别表示点数,边数和需要的白色边数。
  接下来E行
  每行s,t,c,col表示这边的端点(点从0开始标号),边权,颜色(0白色1黑色)。

Output

  一行表示所求生成树的边权和。

Sample Input

2 2 1
0 1 1 1
0 1 2 0

Sample Output

2

HINT

数据规模和约定

  0:V<=10

  1,2,3:V<=15

  0,..,19:V<=50000,E<=100000

  所有数据边权为[1,100]中的正整数。

Source

只想说好巧妙地想法……

对于每条白边,我们每次给他加一个值x(x∈[-101,101],因为所有边权都在这个范围之内),易看出随着x的增大,白边在MST中的数量是渐渐减少的,我们求出每条白边+x时MST中白边的最大数量,因此求出第一个小于need的x,x-1就是我们需要的x,求出此时的MST,即要求的答案。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
struct node
{int u,v,w,c;
} e[100005];
int u[100005],v[100005],w[100005],c[100005],f[50005];
int n,m,need,ans,sum,cnt,l,r;
int find(int x) { return x==f[x]?x:f[x]=find(f[x]); }
bool cmp(node a,node b)
{return ((a.w<b.w)||((a.w==b.w)&&(a.c<b.c)));
}
bool pd(int x)
{ans=0;cnt=0;for (int i=1;i<=n;i++) f[i]=i;for (int i=1;i<=m;i++){e[i].u=u[i],e[i].v=v[i],e[i].w=w[i];e[i].c=c[i];if(!c[i])e[i].w+=x;}sort(e+1,e+m+1,cmp);for (int i=1;i<=m;i++){int p=find(e[i].u),q=find(e[i].v);if (p!=q){f[p]=q;ans+=e[i].w;if (e[i].c==0) cnt++;}}return cnt>=need;
}
int main()
{scanf("%d%d%d",&n,&m,&need);for (int i=1;i<=m;i++){scanf("%d%d%d%d",&u[i],&v[i],&w[i],&c[i]);u[i]++; v[i]++;}l=-101; r=101;while (l<=r){int mid=(l+r)/2;if (pd(mid)){l=mid+1;sum=ans-need*mid;}else r=mid-1;}printf("%d",sum);
}

转载于:https://www.cnblogs.com/ws-fqk/p/4660841.html

[BZOJ2654] tree相关推荐

  1. WQS二分 学习笔记 + 例题([BZOJ2654]Tree、[联考2018]林克卡特树)

    目录 问题类型 WQS二分思路 形象地说 板题 题意 & 解法 CODE 省选题 题意 & 解法 CODE 问题类型 形如"恰好取 k 个--时的最优答案(并非具体方案)&q ...

  2. BZOJ2654: tree 二分答案+最小生成树

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

  3. BZOJ2654 Tree

    Time Limit: 30 Sec Memory Limit: 512 MB Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生 ...

  4. BZOJ2654: tree(陈立杰)

    2654: tree(陈立杰) Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 229  Solved: 91 [Submit][Status] De ...

  5. 洛谷2619/bzoj2654 Tree(凸优化+MST)

    bzoj的数据是真的水.. qwq 由于本人还有很多东西不是很理解 qwq 所以这里只写一个正确的做法. 首先,我们会发现,对于你选择白色边的数目,随着数目的上涨,斜率是单调升高的. 那么这时候我们就 ...

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

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

  7. [XSY]Tree Ext(矩阵树定理,拉格朗日插值,最小生成树,二分)

    Tree Ext 这道题相当于把3道题合了起来. 要求修复的边中恰好有 k 条白边: 五颜六色的幻想乡(附拉格朗日插值法求多项式系数 ) + bzoj2654 tree(WQS二分 新科技get) 是 ...

  8. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  9. 「BZOJ2654」tree

    「BZOJ2654」tree 最小生成树+二分答案. 最开始并没有觉得可以二分答案,因为答案并不单调啊. 其实根据题意,白边的数目肯定大于need条,而最小生成树的白边数并不等于need(废话),可以 ...

最新文章

  1. 数据结构实验之链表五:单链表的拆分-sdut
  2. 使用nginx+tomcat实现动静分离
  3. Windows编程—BroadcastSystemMessage函数详解
  4. toad for mysql调试存储过程_【oracle】oracle 调试 存储过程
  5. 【vue】---动态路由传值
  6. 1041: 谭浩强C语言(第三版)习题5.5
  7. fckeditor java 使用方法_FCKeditor使用说明
  8. IDEA的依赖包报红问题
  9. .jpg .png .jpeg图片转.eps矢量图的python脚本
  10. 梦想,因坚持而绽放——答大学生的兴趣与行动
  11. 玩游戏也能赚钱?新手大学生做游戏短视频,一个内容收益200多
  12. keras 中的verbose详解
  13. 【软考】2020下半年软件设计师 易错知识点(1)
  14. 歪写数学史(当之无愧的数学王子)
  15. 配置zsh的prompt
  16. 【Java】简述断言(assert)的使用以及使用场景
  17. Spring Boot Admin在线查看spring boot后台日志
  18. 2018年统计用区划代码和城乡划分代码(截止2018年10月31日)(数据及python爬虫代码)
  19. 解决远古VOD使用域名访问时出现“文件服务器未找到”的错误
  20. 固态硬盘分为哪几种_固态硬盘接口种类有几种,看看自己的是第几种

热门文章

  1. 线程间通讯机制(基础篇)——Handler、Runnable、HandlerThread、AsyncTask的使用
  2. JZOJ 5435. 【NOIP2017提高A组集训10.30】Graph
  3. linux dns语法检测工具,DNS解析检查工具之nslookup
  4. 本体开发方法——the Method of Ontology Development
  5. 2022.2.22显示器连接器引脚信号定义2
  6. TensorFlow:简单的卷积层、池化层(采样层)示例
  7. java注解@remote,Dwr3.0纯注解(纯Java Code配置)配置与应用浅析二之前端调用后端
  8. poj3253 优先队列
  9. ECharts公共组件:title详解、 tooltip详解、toolbox详解、legend详解、dataZoom详解、visualMap全解...
  10. 玩玩自动化测试之selenium篇