题目描述

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

输入

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

输出

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

样例输入

2 2 1
0 1 1 1
0 1 2 0

样例输出

2


题解

二分+Kruscal

这也算是一道神题了吧...

可以发现,如果白色边的权值全部加上一个值,选择是不会变化的。并且当最小生成树恰好满足题目要求时一定是最优解。

因此我们可以二分白色边加上的权值,求最小生成树,直到得出满足条件的白色边个数为止。最后我们根据选择的方案计算答案即可。

如果先对于所有边排序的话,时间复杂度为 $O(m\log m)$。

#include <cstdio>
#include <algorithm>
#define N 50010
using namespace std;
struct data
{
int x , y , z;
data(int a = 0 , int b = 0 , int c = 0) {x = a , y = b , z = c;}
bool operator<(const data &a)const {return z < a.z;}
}b[N << 1] , w[N << 1];
int tb , tw , n , f[N] , sum;
int find(int x)
{
return x == f[x] ? x : f[x] = find(f[x]);
}
int solve(int mid)
{
int i , pb = 1 , pw = 1 , ans = 0;
sum = 0;
for(i = 0 ; i < n ; i ++ ) f[i] = i;
while(pb <= tb || pw <= tw)
{
if(pw > tw || (pb <= tb && b[pb].z < w[pw].z + mid))
{
if(find(b[pb].x) != find(b[pb].y)) sum += b[pb].z , f[f[b[pb].x]] = f[b[pb].y];
pb ++ ;
}
else
{
if(find(w[pw].x) != find(w[pw].y)) sum += w[pw].z , f[f[w[pw].x]] = f[w[pw].y] , ans ++ ;
pw ++ ;
}
}
return ans;
}
int main()
{
int m , k , i , x , y , z , p , l = -100 , r = 100 , mid , ans;
scanf("%d%d%d" , &n , &m , &k);
for(i = 1 ; i <= m ; i ++ )
{
scanf("%d%d%d%d" , &x , &y , &z , &p);
if(p) b[++tb] = data(x , y , z);
else w[++tw] = data(x , y , z);
}
sort(b + 1 , b + tb + 1) , sort(w + 1 , w + tw + 1);
while(l <= r)
{
mid = (l + r) >> 1;
if(solve(mid) >= k) ans = mid , l = mid + 1;
else r = mid - 1;
}
solve(ans);
printf("%d\n" , sum);
return 0;
}

【bzoj2654】tree 二分+Kruscal的更多相关文章

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

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

  2. BZOJ2654: tree 二分答案+最小生成树

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

  3. 2021.07.19 BZOJ2654 tree(生成树)

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

  4. 【BZOJ2654】tree 二分+最小生成树

    [BZOJ2654]tree Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need ...

  5. [BZOJ2654]tree(二分+MST)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2654 分析:此题很奇葩,我们可以给所有白边加上一个权值mid,那么在求得的MST中白边 ...

  6. BZOJ2654:tree(最小生成树,二分)

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

  7. BZOJ2654 tree 【二分 + 最小生成树】

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

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

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

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

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

随机推荐

  1. MYSQL和ORACLE的一些区别

    有很多应用项目, 刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MYSQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有把数据从MYSQL迁到ORAC ...

  2. [Jmeter]用Jmeter做压力测试(分布式)

    Jmeter 是Java应用,对于CPU和内存的消耗比较大,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起JAVA内存溢出错误.为了让jmeter工具提 ...

  3. P1803 凌乱的yyy

    P1803 凌乱的yyy 题目背景 快noip了,yyy很紧张! 题目描述 现在各大oj上有n个比赛,每个比赛的开始.结束的时间点是知道的. yyy认为,参加越多的比赛,noip就能考的越好(假的) ...

  4. crash:EXC_ARM_DA_ALIGN(关于内存对齐,memcpy)

    crash:EXC_ARM_DA_ALIGN(关于内存对齐,memcpy) 问题描述 在iOS game开发时做内存拷贝时出现了 crash:EXC_ARM_DA_ALIGN,debug版本不会出现, ...

  5. bash脚本练习

    练习一: 1.添加5个用户,user1,...,user5: 2.每个用户的密码同用户名,添加密码完成后,不显示命令的执行结果: 3.每个用户添加完成后,都要显示用户某某已添加成功. useradd ...

  6. 消费者用nginx做负载均衡,提供者用zookeeper自带功能实现负载均衡

    公司的项目基于阿里的Dubbo微服务框架开发.为了符合相关监管部门的安全要求,公司购买了华东1.华东2两套异地服务器,一套是业务服务器,一套是灾备服务器.准备在这两套服务器上实现Dubbo的分布式服务 ...

  7. 流畅的python(笔记)

    流畅的python中有很多奇技淫巧,整本书都在强调如何最大限度地利用Python 标准库.介绍了很多python的不常用的数据类型.操作.库等,对于入门python后想要提升对python的认识应该有 ...

  8. lintcode373 奇偶分割数组

    奇偶分割数组 分割一个整数数组,使得奇数在前偶数在后. 您在真实的面试中是否遇到过这个题? Yes 样例 给定 [1, 2, 3, 4],返回 [1, 3, 2, 4]. 我的方法:设定两个数组,分别 ...

  9. 简单构建基于RDF和SPARQL的KBQA(知识图谱问答系统)

    本文主要通过python实例讲解基于RDF和SPARQL的KBQA系统的构建.该项目可在python2和python3上运行通过. 注:KBQA即是我们通常所说的基于知识图谱的问答系统.这里简单构建的 ...

  10. php面试全套

    7.mvc是什么?相互间有什么关系? 答:mvc是一种开发模式,主要分为三部分:m(model),也就是模型,负责数据的操作;v(view),也就是视图,负责前后台的显示;c(controller), ...