【bzoj2654】tree 二分+Kruscal
题目描述
输入
输出
样例输入
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的更多相关文章
- [BZOJ2654]tree(二分+Kruskal)
2654: tree Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 2733 Solved: 1124[Submit][Status][Discus ...
- BZOJ2654: tree 二分答案+最小生成树
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- 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(二分+MST)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2654 分析:此题很奇葩,我们可以给所有白边加上一个权值mid,那么在求得的MST中白边 ...
- BZOJ2654:tree(最小生成树,二分)
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- BZOJ2654 tree 【二分 + 最小生成树】
题目 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入格式 第一行V,E,need分别表示点数,边数和需要的白色边数. 接下来E行, ...
- [BZOJ2654]:tree(Kruskal+WQS二分)
题目传送门 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. 输入格式 开始标号),边权,颜色(0白色1黑色). 输出格式 一行表 ...
- [bzoj2654] tree 最小生成树kruskal+二分
题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. 输入格式 第一行V,E,need分别表示点数,边数和需要的白色边数.接下来E行, ...
随机推荐
- Codevs1332_上白泽慧音_KEY
题目传送门 裸的模板题,Tarjan求联通量. code: #include <cstdio> #include <vector> #define min(a,b) a< ...
- 【BZOJ3991】寻宝游戏(动态规划)
[BZOJ3991]寻宝游戏(动态规划) 题面 BZOJ 题解 很明显,从任意一个有宝藏的点开始,每次走到相邻的\(dfs\)的节点就行了. 证明? 类似把一棵树上的关键点全部标记出来 显然是要走一个 ...
- Python之多进程多线程
一.多进程与多线程的概念 1.多进程的概念 进程是程序在计算机上的的一次执行活动.当你运行一个程序,你就启动了一个进程.显然,程序是死的(静态的),进程是活的(动态的).进程可以分为系统进程和用户进程 ...
- JS学习 用 arguments 对象模拟函数重载
用 arguments 对象判断传递给函数的参数个数,即可模拟函数重载: function doAdd() { if(arguments.length == 1) { alert(arguments[ ...
- 【费元星原创】一键安装Hadoo2.7.6 集群完全分布式脚本-完美解决
有Bug 欢迎反馈,我不烦:feiyuanxing@gmail.com 1 #!/bin/bash #@author:feiyuanxing [既然笨到家,就要努力到家] #@date:2017-01 ...
- mysql bin log配置及查看
mysql执行sql可以通过设置mysql bin 日志进行记录查看 mysql bin日志配置如下: log_bin:on log_bin_basename:bin文件路径及名前缀(/var ...
- python数据分析基础——pandas Tutorial
参考pandas官方文档: http://pandas.pydata.org/pandas-docs/stable/10min.html#min 1.pandas中的数据类型 Series 带有索引标 ...
- 1208: [HNOI2004]宠物收养所
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 12030 Solved: 4916 Description ...
- Wordcount -- MapReduce example -- Reducer
Reducer receives (key, values) pairs and aggregate values to a desired format, then write produced ( ...
- C语言链接数据库
一.解释一下函数功能和用法 1.mysql_real_connect 函数原型:MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, co ...