Description

\(n\) 个点, \(m\) 条边,边有权值和黑/白色,求含有 \(need\) 个白边的生成树.

Sol

二分+Kruskal.

将每条白边都加上一个权值,然后跑最小生成树.

二分这个权值,显然随着权值的增加,白边个数减少,让权值尽可能大.

最后再减去权值即可.

Code

/**************************************************************
Problem: 2654
User: BeiYu
Language: C++
Result: Accepted
Time:1356 ms
Memory:4612 kb
****************************************************************/ #include<cstdio>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std; const int N = 50005;
const int M = 100005;
#define mid ((l+r)>>1)
#define debug(x) cout<<#x<<"="<<x<<" " struct Edge{ int fr,to,v,c; }edge[M],tmp[M];
bool operator < (const Edge &a,const Edge &b){ return a.v == b.v ? a.c < b.c : a.v < b.v; } int n,m,nd,ans;
int f[N]; inline int in(int x=0,char ch=getchar()){ while(ch>'9' || ch<'0') ch=getchar();
while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
int find(int x){ return f[x] == x ? x :f[x] = find(f[x]); }
int Kruskal(int x){
for(int i=1;i<=m;i++){ tmp[i]=edge[i];if(!tmp[i].c) tmp[i].v+=x; }
sort(tmp+1,tmp+m+1);
for(int i=1;i<=n;i++) f[i]=i;
int cost=0,cnt=1,cw=0;
for(int i=1;i<=m;i++){
int fr=tmp[i].fr,to=tmp[i].to,v=tmp[i].v,c=tmp[i].c;
if(find(fr)!=find(to)) f[find(fr)]=find(to),cost+=v,cw+=1-c,cnt++;
if(cnt==n) break;
}return ans=cost-x*nd,cw;
}
int main(){
n=in(),m=in(),nd=in();
for(int i=1,a,b,c,d;i<=m;i++) a=in()+1,b=in()+1,c=in(),d=in(),edge[i]=(Edge){ a,b,c,d };
int l=-100,r=100;
while(l<=r){
if(Kruskal(mid)>=nd) l=mid+1;
else r=mid-1;
}Kruskal(r),printf("%d\n",ans);
return 0;
}

  

BZOJ 2654: tree的更多相关文章

  1. BZOJ 2654: tree( 二分 + MST )

    我们给白色的边增加权值 , 则选到的白色边就会变多 , 因此可以二分一下. 不过这道题有点小坑... ------------------------------------------------- ...

  2. BZOJ 2654: tree Kruskal+二分答案

    2654: tree Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1863  Solved: 736[Submit][Status][Discuss ...

  3. bzoj 2654 tree - 二分法 - 最小生成树

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

  4. [BZOJ 2654]tree(陈立杰)

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

  5. bzoj 2654 tree 二分+kruskal

    tree Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 2739  Solved: 1126[Submit][Status][Discuss] Des ...

  6. BZOJ 2654 tree(二分答案+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2654 [题目大意] 给你一个无向带权连通图,每条边是黑色或白色. 让你求一棵最小权的恰 ...

  7. hdu 4253 Two Famous Companies BZOJ 2654 tree

    [题意]:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的.边上有权值,问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条.题目保证有解. 思路:我们发现,如果我们给 ...

  8. BZOJ 2654: tree(二分 最小生成树)

    Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 2901  Solved: 1196[Submit][Status][Discuss] Descript ...

  9. bzoj 2212 Tree Rotations

    bzoj 2212 Tree Rotations 考虑一个子树 \(x\) 的左右儿子分别为 \(ls,rs\) .那么子树 \(x\) 内的逆序对数就是 \(ls\) 内的逆序对数,\(rs\) 内 ...

随机推荐

  1. php基础语句2

    计算一个月有多少天 $count = date("t",strtotime("2014-09-01")); // 一个月有多少天

  2. yourphp数据库介绍

    yt_attachment 编辑器图片上传存放的表

  3. mono中显示debug信息(filename/lineno)

    一直发现 mono 的 traceback 没有 fliename.lineno,很奇怪.研究了下,原来编译和运行时要加参数的. dmcs -debug /r:xunit.dll /t:library ...

  4. ES6 import export

    import import './module1.js'; (无对象导入) import d from './module1.js'; (导入默认对象) import {Employee, getEm ...

  5. QQ空间HD(2)-UIPopoverController其它使用

    DJTestViewController.m #import "DJTestViewController.h" #import "DJColorTableViewCont ...

  6. Linux 高精確的時序(sleep, usleep,nanosleep) from:http://blog.sina.com.cn/s/blog_533ab41c0100htae.html

    Linux 高精確的時序(sleep, usleep,nanosleep) (2010-04-14 17:18:26) 转载▼ 标签: 杂谈 分类: linux 首先, 我会说不保证你在使用者模式 ( ...

  7. 解决DWZ(JUI)的panel 点击关闭或者打开按钮 自己写的标签消失

    问题描述:DWZ的panel面板比较常用,我们常常需要在其标题栏上再增加一个些按钮,如下图问题出来了,增加按钮后,点面板收缩按钮,增加的按钮就消失了而且面板收缩的click事件,也跟新增的按钮绑定了, ...

  8. redis php扩展安装下载

    php的redis 扩展下载地址 Windows :http://windows.php.net/downloads/pecl/releases/redis/2.2.7/ 下载对应版本,一般有两个 n ...

  9. Java当中的内存分配以及值传递问题内存解析

    首先必须说明作为Java程序员对于内存只要有大致的了解就可以了,如果你对Java当中的某一个知识点在不需要分析内存分配过程的情况下可以掌握,那就大可不必去研究内存.如果你对知识点已经掌握,那么你应该把 ...

  10. jQuery回调、递延对象总结(中篇) —— 神奇的then方法

    前言: 什么叫做递延对象,生成一个递延对象只需调用jQuery.Deferred函数,deferred这个单词译为延期,推迟,即延迟的意思,那么在jQuery中 又是如何表达延迟的呢,从递延对象中的t ...