【bzoj2654】tree(二分+MST)
好神奇的一道题
我们发现给白边加上权值后 跑MST后 选到的白边就越少
然后就二分这个加上的权值
不过边界好像有点恶心?不过没关系 思想最重要
#include<bits/stdc++.h>
#define N 50005
#define M 100005
using namespace std;
struct Edge
{int from,to,color,val;
}edge[M];
template <class T>
inline void read(T &x)
{x=0;static char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
}
int n,m,need,ans;
int l,r,father[N];
inline int getfather(int x)
{if(father[x]==x) return x;father[x]=getfather(father[x]);return father[x];
}
inline bool cmp(const Edge &x,const Edge &y)
{if(x.val==y.val) return x.color<y.color;return x.val<y.val;
}
inline bool check(int del)
{for(int i=1;i<=m;i++) if(edge[i].color==0) edge[i].val+=del;for(int i=1;i<=n;i++) father[i]=i;sort(edge+1,edge+m+1,cmp);int white=0,sum=0,cnt=0,flag;for(int i=1;i<=m;i++){int fx=getfather(edge[i].from),fy=getfather(edge[i].to);if(fx!=fy){father[fx]=fy; sum+=edge[i].val; cnt++;if(edge[i].color==0) white++;if(cnt==n-1){if(white>=need) ans=sum-del*need,flag=1;else flag=0;break;}}}for(int i=1;i<=m;i++) if(edge[i].color==0) edge[i].val-=del;return flag;
}
int main()
{read(n); read(m); read(need);for(int i=1;i<=m;i++){read(edge[i].from); read(edge[i].to); edge[i].from++; edge[i].to++;read(edge[i].val); read(edge[i].color);r=max(r,edge[i].val+1);}l=-r;while(l<r){int mid=(l+r)/2;if(check(mid)) l=mid+1;else r=mid;}cout<<ans;return 0;
}
转载于:https://www.cnblogs.com/Patrickpwq/articles/9848734.html
【bzoj2654】tree(二分+MST)相关推荐
- BZOJ2654: tree 二分答案+最小生成树
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- WQS二分 学习笔记 + 例题([BZOJ2654]Tree、[联考2018]林克卡特树)
目录 问题类型 WQS二分思路 形象地说 板题 题意 & 解法 CODE 省选题 题意 & 解法 CODE 问题类型 形如"恰好取 k 个--时的最优答案(并非具体方案)&q ...
- 洛谷2619/bzoj2654 Tree(凸优化+MST)
bzoj的数据是真的水.. qwq 由于本人还有很多东西不是很理解 qwq 所以这里只写一个正确的做法. 首先,我们会发现,对于你选择白色边的数目,随着数目的上涨,斜率是单调升高的. 那么这时候我们就 ...
- BZOJ2654:tree(最小生成树,二分)
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- [BZOJ2654] tree
2654: tree Time Limit: 30 Sec Memory Limit: 512 MB Submit: 610 Solved: 225 [Submit][Status][Discus ...
- HDOJ 4253 Two Famous Companies 二分+MST
题目意思:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的.边上有权值, 问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条.题目保证有解. 题解:题目意思很简单就是 ...
- BZOJ2654 Tree
Time Limit: 30 Sec Memory Limit: 512 MB Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生 ...
- BZOJ2654: tree(陈立杰)
2654: tree(陈立杰) Time Limit: 30 Sec Memory Limit: 512 MB Submit: 229 Solved: 91 [Submit][Status] De ...
- [XSY]Tree Ext(矩阵树定理,拉格朗日插值,最小生成树,二分)
Tree Ext 这道题相当于把3道题合了起来. 要求修复的边中恰好有 k 条白边: 五颜六色的幻想乡(附拉格朗日插值法求多项式系数 ) + bzoj2654 tree(WQS二分 新科技get) 是 ...
- BinarySearchTree(二分查找树)
Don't say much, just go to the code. package org.bood.tree;/*** 二分查找树* ps:如果 data[0] 等于一组数据中最小的,那么就会 ...
最新文章
- BM提供支持云的量子计算平台,以加速创新
- ubuntu16.04忘了root密码
- GIS讲堂第二课-地图切片简介以及OL中的调用
- 08_MinNumberInRotateArrary
- Python—实训day12—汽车用户消费投诉案例-分析及可视化
- oracle的一些基本操作,Oracle中的一些基本操作
- 【小梅哥SOPC学习笔记】系统时钟的使用
- oracle监听管理工具,oracle监听器管理
- 简单的时间间隔调度任务
- 二分查找算法详解(折半查询)
- 计算机图形学_GAMES101-现代计算机图形学课程 全笔记
- 微信内提示浏览器打开遮罩层
- emule最新服务器地址,emule更新服务器列表
- 音频格式转换器哪个好,推荐几款免费的mp3格式转换器
- SolidWorks用鼠标中键控制模型的旋转、缩放和平移
- 如何用三角形拼成一个正方形
- oracle分区表备份恢复
- .xz是什么文件怎么解压_如何解压缩 tar.xz 文件
- Operand of null-aware operation ‘!‘ has type ‘SchedulerBinding‘ which excludes null.
- 2021年硕士研究生入学统一考试408计算机学科考试大纲
热门文章
- javascript基础知识-数组
- sqlserver2005查询表字典
- PHP内置函数parse_str会自动进行urldecode(URL解码)
- (原创)EDK中常用文件
- 64位Windows7环境下,Eclipse集成svn后出现Failed to load JavaHL Library的解决办法
- 7个开源的TTS(文本转语音)系统
- SpringBoot常用注解之@Retryable
- vscode在vue页面中书写代码没有提示!怎么破?
- Kafka开发--C#生产和消费消息
- 创建区块计算次数_以太坊创建者Vitalik Buterin为飙升的ETH交易费用提供扩展解决方案...