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(生成树)的更多相关文章

  1. 2021.07.19 P2294 狡猾的商人(差分约束)

    2021.07.19 P2294 狡猾的商人(差分约束) [P2294 HNOI2005]狡猾的商人 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.差分约束最长路与最短 ...

  2. 2021.07.19 P2624 明明的烦恼(prufer序列,为什么杨辉三角我没搞出来?)

    2021.07.19 P2624 明明的烦恼(prufer序列,为什么杨辉三角我没搞出来?) [P2624 HNOI2008]明明的烦恼 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn ...

  3. 2021.12.19 eleveni的刷题记录

    2021.12.19 eleveni的刷题记录 0. 本次记录有意思的题 0.1 每个点恰好经过一次并且求最小时间 P2469 [SDOI2010]星际竞速 https://www.luogu.com ...

  4. 2021.07.09 K-D树

    2021.07.09 K-D树 前置知识 1.二叉搜索树 2.总是很长的替罪羊树 K-D树 建树 K-D树具有二叉搜索树的形态,对于每一个分类标准,小于标准的节点在父节点左边,大于标准的节点在父节点右 ...

  5. AI Summit(2018.07.19)

    AI Summit 时间:2018.07.19地点:北京丽都皇冠假日酒店

  6. 日常Javaweb 2021/11/19

    Javaweb Dao层: //连接数据库,实现增查功能 package dao; import java.sql.Connection; import java.sql.DriverManager; ...

  7. 2021.07.17 题解 CF1385E Directing Edges(拓扑排序)

    2021.07.17 题解 CF1385E Directing Edges(拓扑排序) CF1385E Directing Edges - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) ...

  8. 2021.07.02 P1383 高级打字机题解(可持久化平衡树)

    2021.07.02 P1383 高级打字机题解(可持久化平衡树) 分析: 从可以不断撤销并且查询不算撤销这一骚操作可以肯定这是要咱建一棵可持久化的树(我也只会建可持久化的树,当然,还有可持久化并查集 ...

  9. 2021.07.02 UVa1197 多路归并模板

    2021.07.02 UVa1197 多路归并模板 UVA11997 K Smallest Sums - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 分析: 题解 UVA11997 ...

随机推荐

  1. ansible 五 playbooks剧本使用

    一.Playbook 简介 Playbooks与Ad-Hoc相比,是一种完全不同的运用Ansible的方式,而且是非常之强大的:也是系统ansible命令的集合,其利用yaml语言编写,运行过程,an ...

  2. virtualenv和virtualenvwrapper pipenv安装

    virtualenv和virtualenvwrapper pipenv安装 virtualenvwrapper工具 virtualenvwrapper是用来管理virtualenv的扩展包,用着很方便 ...

  3. [SPDK/NVMe存储技术分析]011 - 内核态ib_post_send()源码剖析

    OFA定义了一组标准的Verbs,并在用户态提供了一个标准库libibverbs.例如将一个工作请求(WR)放置到发送队列的Verb API是ibv_post_send(), 但是在Linux内核,对 ...

  4. Poco实体

    在Poco实体中,一般只有属性没有方法,这在软件设计中称为贫血模型, 在DDD领域驱动设计中,提倡充血模型,即你的Poco实体中,即有属性,也有操作属性的方法,[PS:注意这里说的是操作属性的方法,你 ...

  5. 怎样查看一个 linux 命令的概要与用法?假设你在/bin 目录中偶然看到一个你从没见过的的命令,怎样才能知道它的作用和用法呢?

    使用命令 whatis 可以先出显示出这个命令的用法简要,比如,你可以使用 whatiszcat 去查看'zcat'的介绍以及使用简要. [root@localhost ~]# whatis zcat ...

  6. js file对象 文件大小转换可视容易阅读的单位

    function returnFileSize(number) { if(number < 1024) { return number + 'bytes'; } else if(number & ...

  7. 什么是 Java Timer 类?如何创建一个有特定时间间隔的任务?

    java.util.Timer 是一个工具类,可以用于安排一个线程在未来的某个特定时间执 行.Timer 类可以用安排一次性任务或者周期任务. java.util.TimerTask 是一个实现了 R ...

  8. MOS管防反接电路设计

    转自嵌入式单片机之家公众号 问题的提出 电源反接,会给电路造成损坏,不过,电源反接是不可避免的.所以,我们就需要给电路中加入保护电路,达到即使接反电源,也不会损坏的目的 01二极管防反接 通常情况下直 ...

  9. android JS 互相通讯

    1.android中利用webview调用网页上的js代码. Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true ...

  10. 微信小程序 使用filter过滤器几种方式

    由于微信小程序 技术生态比较闭合,导致很多 现代前端框架很多积累出的成果都没有实现(可能未来会逐一实现). 用惯了现代 再耍小程序 总感觉很不顺手. 需要结果的请直接看最后的WXS View Filt ...