BZOJ 2654: tree
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的更多相关文章
- BZOJ 2654: tree( 二分 + MST )
我们给白色的边增加权值 , 则选到的白色边就会变多 , 因此可以二分一下. 不过这道题有点小坑... ------------------------------------------------- ...
- BZOJ 2654: tree Kruskal+二分答案
2654: tree Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1863 Solved: 736[Submit][Status][Discuss ...
- bzoj 2654 tree - 二分法 - 最小生成树
给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色边数. 接下来E行,每行 ...
- [BZOJ 2654]tree(陈立杰)
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- bzoj 2654 tree 二分+kruskal
tree Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 2739 Solved: 1126[Submit][Status][Discuss] Des ...
- BZOJ 2654 tree(二分答案+并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2654 [题目大意] 给你一个无向带权连通图,每条边是黑色或白色. 让你求一棵最小权的恰 ...
- hdu 4253 Two Famous Companies BZOJ 2654 tree
[题意]:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的.边上有权值,问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条.题目保证有解. 思路:我们发现,如果我们给 ...
- BZOJ 2654: tree(二分 最小生成树)
Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 2901 Solved: 1196[Submit][Status][Discuss] Descript ...
- bzoj 2212 Tree Rotations
bzoj 2212 Tree Rotations 考虑一个子树 \(x\) 的左右儿子分别为 \(ls,rs\) .那么子树 \(x\) 内的逆序对数就是 \(ls\) 内的逆序对数,\(rs\) 内 ...
随机推荐
- Java——新IO 通道
import java.io.File; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.nio.ch ...
- ecshop 活动-》红包
按商品发放:可以给指定某个商品发红包(购买付款,卖家发货后,会自动给买家发送红包:不是买家在付款的时候就自动可以减少红包金额) 按订单金额发放:订单满xx后(卖家发货后,会自动给买家发放红包)
- (转)SVN分支/合并原理及最佳实践
先说说什么是branch.按照Subversion的说法,一个branch是某个development line(通常是主线也即trunk)的一个拷贝,见下图: branch存在的意义在于,在不干扰t ...
- 如何使Python完美升级到新版本
这里提供一种解决的方法 (加上一句话,发现一个新问题:这种方法yum update 后,需要将/usr/bin下的python文件删除,然后执行: # ln -s /usr/local/python2 ...
- C# 获取进程或线程的相关信息
信息来自: http://blog.163.com/kunkun0921@126/blog/static/169204332201293023432113/ using System; using S ...
- wamp包--如何导出sql
在windows下安装wamp,如果不想用phpmyadmin工具和其他工具,如何导出自己想要的sql呢. 比如:我想导出blogyaf库,可以从以下步骤进行操作. 1,进入到wamp的mysql安装 ...
- 论Linux运维的一些基础安全知识和简单办法
不知不觉本人来北京也已经第三个年头了,从一个Linux小小鸟,开始,2012年我参加了第一份工作,其实现在想想其实我是幸运的,本来求学的时候,就没好好的学Linux,我认为有Cisco知识从上wind ...
- Java字节流:BufferedInputStream BufferedOutputStream
-----------------------------------------------------------------------------------BufferedInputStre ...
- HDU4930 Fighting the Landlords 模拟
Fighting the Landlords Fighting the Landlords Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- 优化PHP程序的方法(温故知新)
1. If a method c++an be static, declare it static. Speed improvement is by a factor of 4. 如果一个方法可静态化 ...