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. PCB 模拟Windows管理员域帐号安装软件

    在我们PCB行业中,局域网的电脑一般都会加入域控的,这样可以方便集中管理用户权限,并可以对访问网络资源可以进行权限限制等. 由于加入了域控对帐号权限的管理,这样一来很多人都无权限安装软件,比如:PCB ...

  2. 【WIP】Ruby CSV文件操作

    创建: 2017/09/30                                                                                       ...

  3. codevs1690 开关灯(线段树)

    1690 开关灯 USACO  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description YYX家门前的街上有N(2< ...

  4. HttpFileCollection 类使用

    public ActionResult GetForm()        {            HttpRequest request = System.Web.HttpContext.Curre ...

  5. JavaScript--innerHTML 属性

    innerHTML 属性用于获取或替换 HTML 元素的内容. 语法: Object.innerHTML 注意: 1.Object是获取的元素对象,如通过document.getElementById ...

  6. linux如何更改yum源

    更改linux yum源方法:第一步:进入yum配置文件目录:cd /etc/yum.repos.d/第二步:备份配置文件(如果后续出现了问题就可以恢复):mv CentOS-Base.repo Ce ...

  7. 每天学点Linux命令之 vi 命令

    来学一个vi的命令.要完成的是在一个只读文件中,删掉一行,然后插入两行. 那只读文件你要修改,用sudo vi 总可以了吧.首先 vi命令进入编辑模式. 在非插入模式中: h 光标左移  l 光标右移 ...

  8. Java多线程——线程八锁案例分析

    Java多线程——线程八锁案例分析 摘要:本文主要学习了多线程并发中的一些案例. 部分内容来自以下博客: https://blog.csdn.net/dyt443733328/article/deta ...

  9. [ SCOI 2008 ] 着色方案

    \(\\\) \(Description\) 给出\(K\)种颜料各自的个数\(C_i\),每一个颜料只够涂一个格子,求将颜料用完,涂一排格子,每个格子只能涂一次的条件下,相邻两个格子的颜色互不相同的 ...

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

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