BZOJ 2654: tree(二分 最小生成树)
Time Limit: 30 Sec Memory Limit: 512 MB
Submit: 2901 Solved: 1196
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
0 1 1 1
0 1 2 0
Sample Output
HINT
原数据出错,现已更新 by liutian,但未重测---2016.6.24
Source
对于图上的最小生成树
如果我们得到的最小生成树上的白边小于$need$条,那么说明白边的权值整体偏大,
那么我们考虑对所有的白边减去一个权值,这样最小生成树上的白边就会变多
这个过程很显然具有单调性,于是可以二分减去的权值
注意一个坑:当权值相同的时候优先选择白边
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 1e6 + ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, M, need;
struct Edge {
int u, v, w, opt;
bool operator <(const Edge &rhs) const {
return w == rhs.w ? opt < rhs.opt : w < rhs.w;
}
}E[MAXN], e[MAXN];
int Val = , fa[MAXN];
int siz[MAXN];
int find(int x) {
return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);
}
int unionn(int x, int y) {
int fx = find(x), fy = find(y);
if(siz[fx] < siz[fy]) swap(fx, fy);
fa[fy] = fx;
}
bool check(int x) {
Val = ;
for(int i = ; i <= M; i++) {
E[i] = e[i];
if(e[i].opt == ) E[i].w += x;
}
for(int i = ; i <= N; i++)
fa[i] = i, siz[i] = ;
int tot = , white = ;
sort(E + , E + M + );
for(int i = ; i <= M; i++) {
if(find(E[i].u) != find(E[i].v)) {
unionn(E[i].u, E[i].v);
Val += E[i].w; tot++;
if(E[i].opt == ) white++;
}
if(tot == N - ) break;
}
return white >= need;
}
main() {
#ifdef WIN32
freopen("a.in", "r", stdin);
#endif
N = read(), M = read(), need = read();
for(int i = ; i <= M; i++) {
int x = read() + , y = read() + , z = read(), opt = read();
e[i] = (Edge){x, y, z, opt};
}
int l = -, r = , ans = ;
while(l <= r) {
int mid = l + r >> ;
if(check(mid)) ans = Val - mid * need, l = mid + ;
else r = mid - ;
}
printf("%d", ans);
}
BZOJ 2654: tree(二分 最小生成树)的更多相关文章
- BZOJ 2654: tree( 二分 + MST )
我们给白色的边增加权值 , 则选到的白色边就会变多 , 因此可以二分一下. 不过这道题有点小坑... ------------------------------------------------- ...
- bzoj 2654 tree - 二分法 - 最小生成树
给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色边数. 接下来E行,每行 ...
- bzoj 2654 tree 二分+kruskal
tree Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 2739 Solved: 1126[Submit][Status][Discuss] Des ...
- BZOJ 2654: tree Kruskal+二分答案
2654: tree Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1863 Solved: 736[Submit][Status][Discuss ...
- BZOJ 2654 tree(二分答案+并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2654 [题目大意] 给你一个无向带权连通图,每条边是黑色或白色. 让你求一棵最小权的恰 ...
- BZOJ 2654: tree
Description \(n\) 个点, \(m\) 条边,边有权值和黑/白色,求含有 \(need\) 个白边的生成树. Sol 二分+Kruskal. 将每条白边都加上一个权值,然后跑最小生成树 ...
- [BZOJ 2654]tree(陈立杰)
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- BZOJ 2654 & 玄学二分+MST
题意: 给一张图,边带权且带颜色黑白,求出一棵至少包含k条白边的MST SOL: 正常人都想优先加黑边或者是白边,我也是这么想的...你看先用白边搞一棵k条边的MST...然后维护比较黑边跟白边像堆一 ...
- hdu 4253 Two Famous Companies BZOJ 2654 tree
[题意]:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的.边上有权值,问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条.题目保证有解. 思路:我们发现,如果我们给 ...
随机推荐
- Java 快速入门-06-JDK 目录文件说明
Java 快速入门-06-JDK 目录文件说明 JDK:开发环境,搞技术的人或者应用服务器使用 JRE:运行环境,如浏览器插件或者Swing界面的客户端等最终用户需要使用 JDK自含一个JRE,并依赖 ...
- mac 下常用快捷键
1.快速搜索某个类 双击thift 2.切换不同的类: ctrl+方向键 3.alt+command+B 进入到具体的子类 但是 ctrl+方向键一直切的是电脑上 桌面的切换.打开 系统偏好设置-快捷 ...
- 在AndroidStudio中数据存储第三方数据管理Bmob的使用
---恢复内容开始--- 在日常写代码的过程中我们比较痛苦的就是数据库的建立和使用,那么今天来介绍一下一个第三方的数据管理平台Bmonb. 一.我们首先进入Bmob的官网创建一个账号 Bome官网网址 ...
- 读<css世界>笔记之img标签
Web开发时,为了节约带宽以及提高加载性能,首屏以下的图片就会通过滚屏加载的方式异步加载,然后这个即将被异步加载的图片为了布局稳健,体验良好,往往会使用一张透明的图片占位,如: <img src ...
- Docker的一些常用命令
# systemctl start docker //启动docker # systemctl restart docker //重启docker # systemctl enable docker ...
- 【分享·微信支付】 C# MVC 微信支付教程系列之公众号支付
微信支付教程系列之公众号支付 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后 ...
- Oracle 检查表的数据变动
本知识点仅适用于Oracle 9i以上的版本. 查看表的数据变动情况请使用SQL语句:select * from user_tab_modifications; user_tab_modificati ...
- Python学习---JSON学习180130
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javascript对象: Json字符串就是js对象的一种表现形式(字符串的形式 ...
- 【心得体会】我考完MOS我明白了…
[心得体会]我考完MOS我明白了… 原创 2017-11-10 MSP-李桑榆 MSPrecious成长荟 MOS备考 这篇文章写给还没有考或者准备考MOS的同学 网上有很多介绍MOS考试的 http ...
- docker 17.09.0-ce 启动更换网络地址
一.环境准备 环境1 台虚拟机,系统为centos7 二.17.09.0-ce 安装 卸载安装的所有Docker组件 在 Docker17.03.0-ce 版本中,与在 Docker 1.12 中引入 ...