【bzoj2654】 tree
http://www.lydsy.com/JudgeOnline/problem.php?id=2654 (题目链接)
题意
给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。题目保证有解。
solution
今天考试题,以为是神题不可做,直接放弃了。。没想到这么水。。我们考虑把白边的权值增加,因为无论白边的权值增加多少,最小生成树中的白边不会改变。所以我们二分每次把所有白边的权值增加多少,按边权大小排序后克鲁斯卡尔看选出的白边是否大于need。统计答案
细节
若黑白两边权值相同,优先选择白边加入最小生成树
代码
// bzoj2654
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=1000010;
struct edge {
int u,v,w,c;
friend bool operator < (const edge &a,const edge &b) {
return a.w==b.w?a.c<b.c:a.w<b.w;
}
}e[maxn];
LL fa[maxn],u[maxn],v[maxn],w[maxn],c[maxn],tot,cnt,n,m,ned,sumv; int find(int x) {
return x==fa[x]?x:fa[x]=find(fa[x]);
}
bool check(int x) {
tot=cnt=0;
for (int i=1;i<=n;i++) fa[i]=i;
for (int i=1;i<=m;i++) {
e[i].u=u[i],e[i].v=v[i],e[i].w=w[i],e[i].c=c[i];
if (!c[i]) e[i].w+=x;
}
sort(e+1,e+m+1);
for (int i=1;i<=m;i++) {
int p=find(e[i].u),q=find(e[i].v);
if (p!=q) {
fa[p]=q;
tot+=e[i].w;
if (!e[i].c) cnt++;
}
}
return cnt>=ned;
}
int main() {
scanf("%lld%lld%lld",&n,&m,&ned);
for (int i=1;i<=m;i++) {
scanf("%lld%lld%lld%lld",&u[i],&v[i],&w[i],&c[i]);
u[i]++;v[i]++;
}
int l=-10005,r=10005;
while (l<=r) {
int mid=(l+r)>>1;
if (check(mid)) l=mid+1,sumv=tot-ned*mid;
else r=mid-1;
}
printf("%lld",sumv);
return 0;
}
【bzoj2654】 tree的更多相关文章
- 【BZOJ2654】Tree(凸优化,最小生成树)
[BZOJ2654]Tree(凸优化,最小生成树) 题面 BZOJ 洛谷 题解 这道题目是之前\(Apio\)的时候写的,忽然发现自己忘记发博客了... 这个万一就是一个凸优化, 给所有白边二分一个额 ...
- 【BZOJ2654】tree 二分+最小生成树
[BZOJ2654]tree Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need ...
- 二分+最小生成树【bzoj2654】: tree
2654: tree 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 二分答案,然后跑最小生成树判断. 注意优先跑白色边. code: ...
- 【BZOJ2654】tree
Time Limit: 30 Sec Memory Limit: 512 MB Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树 ...
- 【bzoj2654】tree 二分+Kruscal
题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. 输入 第一行V,E,need分别表示点数,边数和需要的白色边数. 接下来E行,每 ...
- 【bzoj2654]】tree
给白色边都加上一个值,二分这个值,使得选取的白边数量减少 #include<algorithm> #include<iostream> #include<cstdlib& ...
- 【BZOJ2654】tree(生成树 二分)
题目链接 大意 给你一个无向带权连通图,每条边是黑色或白色,求一棵最小权的恰好有\(Need\)条白色边的生成树. 题目保证有解,输出最小权值. 其中每条边权在\([1,100]\)范围内. 思路 首 ...
- 【POJ3237】Tree 树链剖分+线段树
[POJ3237]Tree Description You are given a tree with N nodes. The tree's nodes are numbered 1 through ...
- 【BZOJ】【2631】Tree
LCT 又一道名字叫做Tree的题目…… 看到删边加边什么的……又是动态树问题……果断再次搬出LCT. 这题比起上道[3282]tree的难点在于需要像线段树维护区间那样,进行树上路径的权值修改&am ...
随机推荐
- Struts2动态方法调用(DMI)
当structs.xml解析到Action的时候,默认执行的是此action的execute()方法,但是实际开发中,我们的action中含有很多方法,比如说增删改查的方法,那么structs.xml ...
- P1835 素数密度_NOI导刊2011提高(04)
题目描述 给定区间[L,R](L≤R≤2147483647,R-L≤1000000),请计算区间中素数的个数. 输入输出格式 输入格式: 两个数L和R. 输出格式: 一行,区间中素数的个数. 输入输出 ...
- C# 多重overide
overide 是覆盖的意思,用在且仅用在虚函数上,虚函数可以是virtual或abstract修饰的,或者是overide修饰的. 文档大概是这么说的. 由此知道,由overide修饰的函数都是虚函 ...
- 我使用celery以及docker部署遇到的问题
首先我本机测试时没有问题的,但是在线上docker中,任务一直显示 "Sending due task".超时的任务是 django orm update 操作,本地不会出现这样的 ...
- Java 密码扩展无限制权限策略文件
因为某些国家的进口管制限制,Java发布的运行环境包中的加解密有一定的限制.比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件. 官方网站提供了JCE无限制权限策略文件的下载: ...
- JavaScript中的类型转换(一)
前言 JavaScript是一种非常灵活的弱类型的语言,它的灵活性的一方面体现在其繁杂多样的类型转换.比如当JavaScript期望使用一个布尔值的时候(比如if语句中)你可以提供任一类型的值,Jav ...
- 如何拿到半数面试公司Offer——我的Python求职之路
从八月底开始找工作,短短的一星期多一些,面试了9家公司,拿到5份Offer,可能是因为我所面试的公司都是些创业性的公司吧,不过还是感触良多,因为学习Python的时间还很短,没想到还算比较容易的找到了 ...
- web安全——代理(nginx)
场景 过滤非正常用户使用的http请求. 限制正常用户使用的范围(下载速度.访问频率等). 通过架构规划来提升安全. 能自动解决http请求问题. 解决方案 代理自身的安全 千万不要使用root启动! ...
- 【python游戏编程之旅】第七篇---pygame中的冲突检测技术
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中的Sprite模块和如何加载动画:http://www.cnblogs ...
- MATLAB读取和写入Excel文件
1. 读取Excel文件 (a) 命令方式xlsread: 读取命令:[data,text] = xlsread(FileName, SheetName, Range); data保存的是数据单元 ...