[国家集训队2012]tree(陈立杰) 题解(二分+最小生成树)
tree
时间限制: 3 Sec 内存限制: 512 MB
题目描述
输入
输出
样例输入
2 2 1
0 1 1 1
0 1 2 0
样例输出
2
这道题正解是二分+最小生成树。本题最烦人的就是限制白边的数量因此我们需要一个东西使白边被优先或滞后考虑。由于克鲁斯卡尔是按照边权排序,我们可以给白边附上一个假边权,这样就可以使白边被优先或滞后考虑了。
由于我们还需要保证改变后所有白边的相对大小不变,因此我们不能直接对白边附上某个值而是统一加上或减去某一个值,这样就可以保证相对大小不变了。至于这个值到底应当是多少,我们完全可以二分去查找,毕竟它是满足单调的。
这时一种比较坑爹的情况就会出现了,如果这个图当所有白边边权加x后在最小生成树中的数目比need大,加x+1后数量又比need小,我们该如何处理呢?我们可以想一下,是什么样的黑边被替换了呢?就是白边新增的边的边权-附加的权值,因此如果现在算进最小生成树中的白边数大于need,其实它也是可以被算进结果的。
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<string>
#include<cmath>
using namespace std;
int n,m,ne;
struct ro{
int from,to;
int l,col,rl;
}road[];
void build(int x,int y,int bh,int z,int zx){
road[bh].from=x;
road[bh].to=y;
road[bh].rl=road[bh].l=z;
road[bh].col=zx;
}
bool pd=;
int px(ro a,ro b){
if(a.l==b.l)
return a.col<b.col;
return a.l<b.l;
}
int fa[];
map<int,bool> fw2[][];
map<int,int> fw[][];
void init(int x){
for(int i=;i<=n;i++)
fa[i]=i;
for(int i=;i<=m;i++)
{
if(!road[i].col)
{
road[i].l=road[i].rl+x;
}
}
sort(road+,road+m+,px);
}
int find(int x){
if(fa[x]==x)
return x;
else
return fa[x]=find(fa[x]);
}
void hb(int x,int y){
int a=find(x);
int b=find(y);
if(a>b) fa[a]=b;
else fa[b]=a;
}
int sum=0x7fffffff;
bool check(int x){
int js=,ans=,js2=,js3=; for(int i=;i<=m;i++)
{
if(js==n-)break;
if(find(road[i].from)!=find(road[i].to))
{
js++;
if(road[i].col==)
{
js2++;
}
ans+=road[i].l;
hb(road[i].from,road[i].to);
}
}
if(js2>=ne)
{
sum=ans-ne*x;
return ;
}
pd=;
return ;
}
int main(){
scanf("%d%d%d",&n,&m,&ne);
for(int i=;i<=m;i++)
{
int x,y,z,zx;
scanf("%d%d%d%d",&x,&y,&z,&zx);
build(x,y,i,z,zx);
}
int li=-,ri=;
while(li<=ri)
{
int mid=(li+ri)/;
init(mid);
if(check(mid))
{
li=mid+;
}
else
ri=mid-;
}
printf("%d\n",sum);
//while(1);
return ;
}
[国家集训队2012]tree(陈立杰) 题解(二分+最小生成树)的更多相关文章
- [国家集训队2012]tree(陈立杰)
[国家集训队2012]tree(陈立杰) 题目 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. INPUT 第一行V,E,need分别表示 ...
- [国家集训队2012]middle(陈立杰)
我是萌萌的传送门 我是另一个萌萌的传送门 脑残错误毁一下午…… 其实题解早就烂大街了,然而很久之前我只知道是二分答案+主席树却想不出来这俩玩意儿怎么一块儿用的……今天又翻了几篇题解才恍然大悟,是把权值 ...
- [COGS 1799][国家集训队2012]tree(伍一鸣)
Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...
- 洛谷.2619.[国家集训队2]Tree I(带权二分 Kruskal)
题目链接 \(Description\) 给定一个无向带权连通图,每条边是黑色或白色.求一棵最小权的恰好有K条白边的生成树. \(Solution\) Kruskal是选取最小的n-1条边.而白边数有 ...
- 数据结构(动态树):[国家集训队2012]tree(伍一鸣)
[问题描述] 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原 ...
- cogs1799 [国家集训队2012]tree(伍一鸣)
LCT裸题 注意打标记之间的影响就是了 这个膜数不会爆unsigned int #include<cstdio> #include<cstdlib> #include<a ...
- P2619 [国家集训队2]Tree I(最小生成树+二分)
P2619 [国家集训队2]Tree I 每次二分一个$x$,每条白边加上$x$,跑最小生成树 统计一下满足条件的最小值就好了. to me:注意二分不要写挂 #include<iostream ...
- Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...
- [国家集训队2012]middle
http://cogs.pro:8080/cogs/problem/problem.php?pid=1763 二分答案x 把区间内>=x的数设为1,<x的数设为-1 左端点在[a,b]之间 ...
随机推荐
- jquery.tmpl.js使用外部 jQuery Template文件
$.get('/js/templates/filename.html', function(template) { $.tmpl(template, data).appendTo('#whatever ...
- WPF 设置只能运行一个实例
codereview上的帖子 https://codereview.stackexchange.com/questions/20871/single-instance-wpf-application ...
- Linux数据流的重定向
>覆盖内容:>>追加内容:<和>的区别在于重定向方向不一致,>表示重定向从左到右:>>和<<类似 简单的重定向 0 /dev/stdin 标 ...
- [转] Protobuf高效结构化数据存储格式
从公司的项目源码中看到了这个东西,觉得挺好用的,写篇博客做下小总结.下面的操作以C++为编程语言,protoc的版本为libprotoc 3.2.0. 一.Protobuf? 1. 是什么? Goo ...
- CDMA子钟
SYN6103型 CDMA子钟 产品概述 SYN6103型CDMA子钟是由西安同步电子科技有限公司精心设计.自行研发生产的一套从CDMA网络获取标准时间信号信息的子钟,能方便部署在任何有CDMA信号的 ...
- CodeSmith使用SQLite Provider找不到请求的 .Net Framework 数据提供程序
关于CodeSmith5使用SQLite Provider时的报错:System.BadImageFormatException: 未能加载文件或程序集“System.Data.SQLite,.... ...
- vue的checkbox或多选的select的代码例子
另外一种实现checkbox的vue绑定方法代码: 给v-model绑定一个相同的数组类型的属性: <div id="app"> <label>jack&l ...
- Ubuntu --- 【转】安装lamp(php7.0)
本篇转自:http://www.laozuo.org/8303.html.以防丢失,再次记录 PHP7已经出来有一段时间,根据网友的实践测试比之前的版本效率会高不少,而且应用到网站中打开速度会有明显的 ...
- Redis 在java中的使用(登录验证,5分钟内连续输错3次密码,锁住帐号,半小时后解封)(三)
在java中使用redis,做简单的登录帐号的验证,使用string类型,使用redis的过期时间功能 1.首先进行redis的jar包的引用,因为用的是springBoot,springBoot集成 ...
- CLR 垃圾回收算法
c#相较于c,c++而言,在内存管理上为程序员提供了极大的方便,解放了程序员与内存地址打交道,提高了程序员的工作效率.比如c中分配的malloc堆空间没有释放导致的内存泄露,数组越界导致的踩内存错误, ...