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 之集合框架 中(10)
Map和HashMap Map接口: Map 提供了一种映射关系,其中的元素是以键值对(Key-Value)的形式 存储的,能够实现根据Key快速查找value Map中的键值对以Entry类型的对象 ...
- integer storage and decimal storage differences in java
package storage.java; public class StorageJava { public static void main(String[] args) { byte b = 1 ...
- flask多线程多协程操作
local的作用:各个线程各开辟一块空间互不影响 基于local""" import threading from threading import local impo ...
- c# 设计模式 之:工厂模式之---工厂模式
1.uml类图: 实现和依赖关系: 实现: SportFactory.JeepFactory.HatchbackFactory 实现 IFactory 接口 SportCar.JeepCar.Hatc ...
- php自动载方法有两种.
但有一问题没有解决, 就是在include前判断文件是否存在的问题. 1 2 3 4 5 6 7 8 9 10 11 12 13 set_include_path('aa' . PATH_SEPARA ...
- July 28th 2017 Week 30th Friday
If equal affection cannot be, let the more loving be me. 如果没有相等的爱,那就让我爱多一点吧. There is seldom equal a ...
- redis下的持久化保存
rdb.h rdb.c ---> 完成数据保存到临时文件,再利用rename保存到指定文件的过程: 如果需要写一个数据持久化保存的功能时,可以参考这部分代码: //rdb API int ...
- [EffectiveC++]item23:Prefer non-member non-friend functions to member functions
99页 导致较大封装性的是non-member non-friend函数,因为它并不增加“能否访问class内之private成分”的函数数量.
- [Codeup 25481] swan
莫名其妙还找到了另一个铟炔锶烃的OJ : Codeup墓地 25481: swan 时间限制: 1 Sec 内存限制: 128 MB献花: 86 解决: 13[献花][花圈][TK题库] 题目描述 ...
- 阿里八八——预则立&&他山之石
团队计划--α版本Issues 概况 采访团队:"一起买"开发团队 采访形式:团队--团队 团队采访 内容提炼 项目选题 团队选题本身并没有大的亮点,但是可以从功能下手,多想想项目 ...