tree bzoj-2654

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

    注释:$1\le V\le 5\cdot 10^4$,$1\le E \le 10^5$,$1\le val_i\le 100$。

      想法:乍一看最小生成树,然后直接gg,没有更好的处理方法。用什么样的方法可以将白边的边数恰好为need且边权和最小?EdwardFrog讲课的时候就提出了这样的方法:二分出往白边上加上多少权值。首先,统一的往白边上加权值会使得加权后的最小生成树中白边个数下降,这是单调的,我们可以用二分实现。二分的同时求出加权后的使得最小生成树中白边恰好有need条的边权val,求出最小生成树后将val*need减掉即可。

    最后,附上丑陋的代码... ...

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;
struct E
{
int a,b,v,c,d;
}e[100050];
bool cmp(const E &x,const E &y)
{
if(x.c==y.c) return x.d<y.d;
return x.c<y.c;
}
int n,m,k,fa[50050],reimu;
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void init(int x)
{
for(int i=0;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++)
{
if(e[i].d==0)
{
e[i].c=e[i].v+x;
}
else
e[i].c=e[i].v;
}
sort(e+1,e+m+1,cmp);
}
int check(int mn)
{
reimu=0;
int re=0,nowe=0;
init(mn);
for(int i=1;i<=m;i++)
{
int x=e[i].a,y=e[i].b;
int dx=find(x),dy=find(y);
//printf("%d %d",x,y);
if(dx!=dy)
{
reimu+=e[i].c;
fa[dx]=dy;
if(!e[i].d)
re++;
nowe++;
if(nowe==n-1)
{
break;
}
}
}
return re;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&e[i].a,&e[i].b,&e[i].v,&e[i].d);
}
int l=-1000,r=1000,ans;
while(l<r)
{
int mid=(l+r)>>1;
int z=check(mid);
if(z<k)r=mid;
else l=mid+1,ans=reimu-k*mid;
}
printf("%d\n",ans);
}

    小结:二分显然是正确的。

[bzoj2654]tree_二分_kruskal的更多相关文章

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

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

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

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

  3. AHOI2018训练日程(3.10~4.12)

    (总计:共90题) 3.10~3.16:17题 3.17~3.23:6题 3.24~3.30:17题 3.31~4.6:21题 4.7~4.12:29题 ZJOI&&FJOI(6题) ...

  4. BZOJ_1196_[HNOI2006]公路修建问题_kruskal+二分答案

    BZOJ_1196_[HNOI2006]公路修建问题_kruskal+二分答案 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1196 分析: ...

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

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

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

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

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

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

  8. 【bzoj2654】tree 二分+Kruscal

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

  9. 二分+最小生成树【bzoj2654】: tree

    2654: tree 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 二分答案,然后跑最小生成树判断. 注意优先跑白色边. code: ...

随机推荐

  1. MVVMLight消息通知实现机制详解(一)

    最近对委托.事件的订阅使用的太多,订阅与被订阅之间的绑定约束非常...麻烦,所以翻了下MVVMLight源码找出这段可以拿出来用的部分,详情见下: 一.开发中遇到的问题: 场景1:ClassA中存在事 ...

  2. oracleXE简易版---使用基础

    1.开启服务 2.更改端口号 a)   EX修改HTTP服务端口,避免和TOMCAT端口冲突 Oracel默认会启动HTTP服务,占有端口8080,但一般8080时TOMCAT的配置端口 可以修改TO ...

  3. hibernate基础学习---hierbnate2级缓存

    1:开启二级缓存sessionFactory需要安装jar包 2:在实体类配置文件添加(配置二级缓存).我的配置文件是Account.hbm.xml <?xml version="1. ...

  4. Java高质量20问

    问题一:在多线程环境中使用HashMap会有什么问题?在什么情况下使用get()方法会产生无限循环? HashMap本身没有什么问题,有没有问题取决于你是如何使用它的.比如,你在一个线程里初始化了一个 ...

  5. 【知识总结】快速傅里叶变换(FFT)

    这可能是我第五次学FFT了--菜哭qwq 先给出一些个人认为非常优秀的参考资料: 一小时学会快速傅里叶变换(Fast Fourier Transform) - 知乎 小学生都能看懂的FFT!!! - ...

  6. flask 初始

    一.flask安装 这里提供两种安装方式: 第一种: pip3 install flask 第二种: pip3 install -i https://pypi.douban.com/simple/ f ...

  7. Elasticsearch之CURL命令的GET

    这是个查询命令. 前期博客 Elasticsearch之CURL命令的PUT和POST对比 1. 以上是根据员工id查询. 即在任意的查询字符串中添加pretty参数,es可以得到易于我们识别的jso ...

  8. 背包系列 hdu 3535 分组背包

    题意: 有n组工作,现在有T分钟时间去做一些工作.每组工作里有m个工作,并且类型为s,s类型可以为0,1,2,分别表示至少选择该组工作的一项,至多选择该工作的一项,不限制选择.每个工作有ci,gi两个 ...

  9. 开发日记(项目中SQL查询的优化)

    今天发现自己之前写的一些SQL查询在执行效率方面非常不理想,于是尝试做了些改进. 需求为查询国地税表和税源表中,国税有而税源没有的条目数,之前的查询如下: SELECT COUNT(NAME)     ...

  10. html5——边框

    精确控制 /*水平半径 垂直半径;*/ border-top-left-radius: 30px 40px; border-top-right-radius: 30px 40px; border-bo ...