二分+最小生成树【bzoj2654】: tree
2654: tree
给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。
题目保证有解。
二分答案,然后跑最小生成树判断。
注意优先跑白色边。
code:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int wx=500017;
inline int read(){
int sum=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}
return sum*f;
}
int fa[wx];
int n,m,k,tot,ans;
struct node{
int x,y,d,flag;
friend bool operator < (const node & a,const node & b){
return a.d<b.d;
}
}t[wx*2];
int find(int x){
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
}
bool ok(int now){
for(int i=1;i<=n;i++)fa[i]=i;
int sum=0,tmp=0;
for(int i=1;i<=m;i++){
if(t[i].flag)continue;
int fx=find(t[i].x); int fy=find(t[i].y);
if(fx==fy)continue;
if(t[i].flag==0&&tmp>=k)continue;
sum+=t[i].d; fa[fx]=fy;
if(t[i].flag==0)tmp++;
}
for(int i=1;i<=m;i++){
int fx=find(t[i].x); int fy=find(t[i].y);
if(fx==fy)continue;
if(t[i].flag==0&&tmp>=k)continue;
sum+=t[i].d; fa[fx]=fy;
if(t[i].flag==0)tmp++;
}
return sum<=now&&tmp>=k;
}
int main(){
n=read(); m=read(); k=read();
for(int i=1;i<=m;i++){
int x,y,z,c;
x=read(); y=read(); z=read(); c=read();
x++; y++;
t[i].x=x; t[i].y=y; t[i].d=z; t[i].flag=c;
tot+=z;
}
sort(t+1,t+1+m);
int l=0,r=tot;
while(l<=r){
int mid=l+r>>1;
if(ok(mid))ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}
二分+最小生成树【bzoj2654】: tree的更多相关文章
- [国家集训队2012]tree(陈立杰) 题解(二分+最小生成树)
tree 时间限制: 3 Sec 内存限制: 512 MB 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入 第一行V, ...
- 2021.07.19 BZOJ2654 tree(生成树)
2021.07.19 BZOJ2654 tree(生成树) tree - 黑暗爆炸 2654 - Virtual Judge (vjudge.net) 重点: 1.生成树的本质 2.二分 题意: 有一 ...
- 【BZOJ2654】tree 二分+最小生成树
[BZOJ2654]tree Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need ...
- BZOJ2654: tree 二分答案+最小生成树
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- BZOJ2654 tree 【二分 + 最小生成树】
题目 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入格式 第一行V,E,need分别表示点数,边数和需要的白色边数. 接下来E行, ...
- [bzoj2654] tree 最小生成树kruskal+二分
题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. 输入格式 第一行V,E,need分别表示点数,边数和需要的白色边数.接下来E行, ...
- BZOJ2654:tree(最小生成树,二分)
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...
- BZOJ 2654: tree(二分 最小生成树)
Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 2901 Solved: 1196[Submit][Status][Discuss] Descript ...
随机推荐
- 使用Asset Pipeline管理rails生产环境静态资源实现步骤
1. 修改项目中指向静态资源文件的链接 a) 访问静态资源文件 <%= stylesheet_link_tag "application", media: &q ...
- 怎样在win7中 安装Tomcat7.0
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器. 我们可以到官方网站下载Tomcat7 工具/原料 win7 Tomcat7.0 方法/步骤 1 在官网下载软件: ...
- python3 中 requests 框架
原文的文件地址:http://blog.csdn.net/shanzhizi/article/details/50903748 一.安装 Requests 通过pip安装 pip install re ...
- Appium—python_ 安卓手机划屏幕操作
开始的时候 不知道 python_unittest框架的命名规则,导致方法进不去,后来 改变方法名 能获取 # conding=utf- from appium import webdriver im ...
- Android APP使用系统签名
Android M平台在写APP测试使用MediaRecoder通过AudioSource.VOICE_CALL来录制通话上下行音的时候,需要权限 <uses-permission androi ...
- oracle DDL(create、alter、drop)
一.创建表1.创建表CREATE TABLE <table_name>( column1 DATATYPE [NOT NULL] [PRIMARY KEY], column2 DATATY ...
- secureCrt常用命令
一.常用命令: 1.ls 只列出文件名 (相当于dir,dir也可以使用) -A:列出所有文件,包含隐藏文件. -l:列表形式,包含文件的绝大部分属性. -R:递归显示. --help:此命令的帮助. ...
- ArcGIS Field Type /esriFieldTypeDate(转)
ArcGIS Field Type The following table outlines the equivalent field data types in ArcCatalog, ArcO ...
- strstr()查找函数,strchr(),strrchr(),stristr()/strpos(),strrpos()查找字符串位置
在一个较长的字符串这查找匹配的字符串或字符,其中strstr()和strchr()是完全一样的. 例: echo strstr('why always you','you'); 输出: you 如果为 ...
- Tensorflow梯度下降应用
import tensorflow as tfimport numpy as np #使用numpy生成随机点x_data = np.random.rand(100)y_data = x_data*0 ...