2021.07.19 BZOJ2654 tree(生成树)
2021.07.19 BZOJ2654 tree(生成树)
tree - 黑暗爆炸 2654 - Virtual Judge (vjudge.net)
重点:
1.生成树的本质
2.二分
题意:
有一张无相带权连通图,每一条边都是黑色或者白色,求一棵恰好有need条白色边的最小生成树。
分析:
我们可以把每一条边按照一定优先级进行排序,当然,手动优先级(手动狗头),对于同一个权值的边,我们规定白色边比黑色边优先级高。但是对于权值特别小的的黑色边,在构成一棵生成树时,搞不好所有边都是由黑色边构成的,怎么办呢?当然还是手动给白色边改变优先级啊,把白色边供到太上皇的位置,他不想优先出现都难。白色边的颜色肯定不能改变,只能改变它的权值,白色边整体大平移活动正式开始!至于白色边到底要减多少合适,交给二分,朕相信它~
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=5e5+10;
int n,m,need,cnt,fa[N],vis[N*2];
struct node{
int col,from,to,val;
bool operator <(const node &b)const{
return val==b.val?col<b.col:val<b.val;
}
}a[N*2];
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int kruskal(){
int sum=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)fa[i]=i;
sort(a+1,a+m+1);
for(int i=1;i<=m;i++){
int ui=find(a[i].from),vi=find(a[i].to);
if(ui==vi)continue;
fa[ui]=vi;
sum+=a[i].val;
vis[i]=1;
}
return sum;
}
bool check(int len){
for(int i=1;i<=m;i++)if(!a[i].col)a[i].val-=len;
int tmp=kruskal(),sum=0;
for(int i=1;i<=m;i++)if(!a[i].col)
a[i].val+=len,sum+=vis[i];
return sum>=need;
}
int solve(){
int l=-200,r=200;
while(l<r){
int mid=(l+r)>>1;
if(check(mid))r=mid;
else l=mid+1;
}
return l;
}
int main(){
n=read();m=read();need=read();
for(int i=1;i<=m;i++){
a[i].from=read()+1;a[i].to=read()+1;
a[i].val=read();a[i].col=read();
}
int len=solve();
for(int i=1;i<=m;i++)if(!a[i].col)a[i].val-=len;
int ans=kruskal();
for(int i=1;i<=m;i++)if(!a[i].col)a[i].val+=len;
ans+=len*need;
cout<<ans;
return 0;
}
2021.07.19 BZOJ2654 tree(生成树)的更多相关文章
- 2021.07.19 P2294 狡猾的商人(差分约束)
2021.07.19 P2294 狡猾的商人(差分约束) [P2294 HNOI2005]狡猾的商人 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.差分约束最长路与最短 ...
- 2021.07.19 P2624 明明的烦恼(prufer序列,为什么杨辉三角我没搞出来?)
2021.07.19 P2624 明明的烦恼(prufer序列,为什么杨辉三角我没搞出来?) [P2624 HNOI2008]明明的烦恼 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn ...
- 2021.12.19 eleveni的刷题记录
2021.12.19 eleveni的刷题记录 0. 本次记录有意思的题 0.1 每个点恰好经过一次并且求最小时间 P2469 [SDOI2010]星际竞速 https://www.luogu.com ...
- 2021.07.09 K-D树
2021.07.09 K-D树 前置知识 1.二叉搜索树 2.总是很长的替罪羊树 K-D树 建树 K-D树具有二叉搜索树的形态,对于每一个分类标准,小于标准的节点在父节点左边,大于标准的节点在父节点右 ...
- AI Summit(2018.07.19)
AI Summit 时间:2018.07.19地点:北京丽都皇冠假日酒店
- 日常Javaweb 2021/11/19
Javaweb Dao层: //连接数据库,实现增查功能 package dao; import java.sql.Connection; import java.sql.DriverManager; ...
- 2021.07.17 题解 CF1385E Directing Edges(拓扑排序)
2021.07.17 题解 CF1385E Directing Edges(拓扑排序) CF1385E Directing Edges - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) ...
- 2021.07.02 P1383 高级打字机题解(可持久化平衡树)
2021.07.02 P1383 高级打字机题解(可持久化平衡树) 分析: 从可以不断撤销并且查询不算撤销这一骚操作可以肯定这是要咱建一棵可持久化的树(我也只会建可持久化的树,当然,还有可持久化并查集 ...
- 2021.07.02 UVa1197 多路归并模板
2021.07.02 UVa1197 多路归并模板 UVA11997 K Smallest Sums - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 分析: 题解 UVA11997 ...
随机推荐
- Windows10运行Cura源代码,搭建环境教程
参考官方文档 https://github.com/Ultimaker/Cura/wiki/Running-Cura-from-Source-on-Windows#python-3810 注意 这些说 ...
- 通过PROFINET实现S7-1200与CU320-2 PN S120通讯
1.概述 S7-1200 与 CU320-2PN 之间通过 PROFINET IO 可进行周期性及非周期性数据通讯. 使用 S7 功能块 DPWR_DAT/DPRD_DAT,S7-1200PLC 通过 ...
- Hadoop-全分布式配置
目录 一.配置基础环境 1.配置网络信息 2.配置主机名 3.主机名与IP的映射关系 4.测试互通性 二.关闭防火墙和SELinux 1.关闭防火墙 2.关闭SELinux 三.安装 Hadoop 1 ...
- docker-compose + nginx部署前后端分离的项目
安装docker 安装必要的系统工具 # 更新yum工具 yum update -y # 安装必要的工具 yum install -y yum-utils device-mapper-persiste ...
- IDEA使用Docker插件构建镜像
IDEA使用Docker插件构建镜像 记一次坑 第一次插件docker-maven-plugin的 配置文件中没写远程主机的地址 <dockerHost>http://192.168.1 ...
- 数据库连接(Database link)?
在一个用户下,可以获取到另外的用户下的表的数据,通常在跨数据库时使用. create database link link93 connect to scott identified by tiger ...
- 如何在 spring 中启动注解装配?
默认情况下,Spring 容器中未打开注解装配.因此,要使用基于注解装配,我们 必须通过配置 <context:annotation-config/> 元素在 Spring 配置文件 中启 ...
- memcached 能接受的 key 的最大长度是多少?
key 的最大长度是 250 个字符.需要注意的是,250 是 memcached 服务器端内 部的限制,如果您使用的客户端支持"key 的前缀"或类似特性,那么 key(前缀 + ...
- 什么是 Spring 的依赖注入?
依赖注入,是 IOC 的一个方面,是个通常的概念,它有多种解释.这概念是说你 不用创建对象,而只需要描述它如何被创建.你不在代码里直接组装你的组件和 服务,但是要在配置文件里描述哪些组件需要哪些服务, ...
- 客户端注册 Watcher 实现?
1.调用 getData()/getChildren()/exist()三个 API,传入 Watcher 对象 2.标记请求 request,封装 Watcher 到 WatchRegistrati ...