Description

给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。
题目保证有解。

Input

第一行V,E,need分别表示点数,边数和需要的白色边数。
接下来E行,每行s,t,c,col表示这边的端点(点从0开始标号),边权,颜色(0白色1黑色)。

Output

一行表示所求生成树的边权和。
V<=50000,E<=100000,所有数据边权为[1,100]中的正整数。

Sample Input

2 2 1
0 1 1 1
0 1 2 0

Sample Output

2

Solution

这做法反正我是想不到的...

考虑怎么让拎出来的白色边减少

我们可以给白色边加个权值

然后又因为这个权值有单调性,所以二分来求最小

二分之后拿最小生成树判定就好了

#include <bits/stdc++.h>

using namespace std ;

#define N 100010
#define inf 0x3f3f3f3f int n , m , sum = , ans = ;
struct node {
int u , v , w , col ;
} e[ N ] ;
int cnt , ned , t = ;
int f[ N ] ; bool cmp( node a , node b ) {
return ( !a.col ? a.w + t : a.w ) < ( !b.col ? b.w + t : b.w ) ;
} int find( int x ) {
if( f[ x ] == x ) return x ;
return f[ x ] = find( f[ x ] ) ;
} bool check( int x ) {
t = x ;
for( int i = ; i <= n ; i ++ ) f[ i ] = i ;
sort( e + , e + cnt + , cmp ) ;
int tot = ; sum = ;
for( int i = ; i <= cnt ; i ++ ) {
int x = find( e[ i ].u ) , y = find( e[ i ].v ) ;
if( x != y ) {
f[ y ] = x ;
sum += e[ i ].w ;
if( !e[ i ].col ) tot ++ ;
}
}
return tot >= ned ;
} int main() {
scanf( "%d%d%d" , &n , &m , &ned ) ;
for( int i = , u , v , w , col ; i <= m ; i ++ ) {
scanf( "%d%d%d%d" , &u , &v , &w , &col ) ;
e[ ++ cnt ].u = ++u ; e[ cnt ].v = ++v ; e[ cnt ].w = w ;
e[ cnt ].col = col ;
}
int l = -1e5 , r = 1e5 ;
while( l <= r ) {
int mid = ( l + r ) >> ;
if( check( mid ) ) l = mid + , ans = sum ;
else r = mid - ;
}
printf( "%d\n" , ans ) ;
return ;
}

BZOJ2654: tree 二分答案+最小生成树的更多相关文章

  1. [BZOJ1196][HNOI2006]公路修建问题 二分答案+最小生成树

    Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那 里的交通情况还是很糟糕.所以,OIER Association组 ...

  2. [BZOJ2654]tree(二分+Kruskal)

    2654: tree Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 2733  Solved: 1124[Submit][Status][Discus ...

  3. BZOJ2654 tree

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...

  4. [bzoj2654] tree 最小生成树kruskal+二分

    题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. 输入格式 第一行V,E,need分别表示点数,边数和需要的白色边数.接下来E行, ...

  5. [BZOJ2654]:tree(Kruskal+WQS二分)

    题目传送门 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. 输入格式 开始标号),边权,颜色(0白色1黑色). 输出格式 一行表 ...

  6. Luogu P1396 营救【最小生成树/二分答案/最短路】 By celur925

    题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门…… 妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小 ...

  7. 2021.07.19 BZOJ2654 tree(生成树)

    2021.07.19 BZOJ2654 tree(生成树) tree - 黑暗爆炸 2654 - Virtual Judge (vjudge.net) 重点: 1.生成树的本质 2.二分 题意: 有一 ...

  8. BZOJ4317Atm的树&BZOJ2051A Problem For Fun&BZOJ2117[2010国家集训队]Crash的旅游计划——二分答案+动态点分治(点分树套线段树/点分树+vector)

    题目描述 Atm有一段时间在虐qtree的题目,于是,他满脑子都是tree,tree,tree…… 于是,一天晚上他梦到自己被关在了一个有根树中,每条路径都有边权,一个神秘的声音告诉他,每个点到其他的 ...

  9. BZOJ4556 [Tjoi2016&Heoi2016]字符串 SA ST表 二分答案 主席树

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4556.html 题目传送门 - BZOJ4556 题意 给定一个长度为 $n$ 的字符串 $s$ . ...

随机推荐

  1. 国内maven库

    国内maven库 <mirrors> <mirror> <id>CN</id> <name>OSChina Central</name ...

  2. 非常不错的一个JS分页效果代码

    这里分享一个不错的js分页代码. 代码中cpage是页面计数,应为全局变量,可以随处调用它: totalpage是总页数. 与asp分页代码很类似,也是先取得记录总数,然后实现分页,基本的分页思路与原 ...

  3. Qt实现 QQ好友列表QToolBox

    简述 QToolBox类提供了一个列(选项卡式的)部件条目. QToolBox可以在一个tab列上显示另外一个,并且当前的item显示在当前的tab下面.每个tab都在tab列中有一个索引位置.tab ...

  4. js实现轮播图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. sql中字符串如何比大小

    从字符串的第一个字符开始比较ASSCII码值,如果相等则看下一个,以此类推. 数字的ASCII码<大写字母的ASCII码<小写字母的ASCII码. ASCII码

  6. linux eaccelerator

    wget https://github.com/eaccelerator/eaccelerator/tarball/master tar -jxvf eaccelerator-0.9.6.1.tar. ...

  7. ASIC中的一些库和文件类型

    以下内容均来源于网络: 在进行综合,分析STA时,有几种库类型. NLDM: 非线性线载模型,最基本的dot lib. 电压源模型,cap值是单一值.  在90nm工艺以下,由于晶体管的特性变得很复杂 ...

  8. 33. Search in Rotated Sorted Array(二分查找)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  9. 好消息啊,有些c似乎不用加厂商前缀了

    今天写程序,一个不小心,没写厂商前缀,然而,,,,,,, 可以运行了(我居然不知道这个消息!!!!) 赶紧写几个字纪念一下. (把鼠标移动到红色的字上边~~~) don' you think that ...

  10. mysql插入和更新时自动更新为当前时间

    创建表的时候添加 CREATE TABLE `tmp` (   `id` varchar(32) NOT NULL,  `update_time ` timestamp NOT NULL DEFAUL ...