tree

时间限制: 3 Sec  内存限制: 512 MB

题目描述

给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。
题目保证有解。

输入

第一行V,E,need分别表示点数,边数和需要的白色边数。
接下来E行,每行s,t,c,col表示这边的端点(点从0开始标号),边权,颜色(0白色1黑色)。

输出

一行表示所求生成树的边权和。
V<=50000,E<=100000,所有数据边权为[1,100]中的正整数。

样例输入

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(陈立杰) 题解(二分+最小生成树)的更多相关文章

  1. [国家集训队2012]tree(陈立杰)

    [国家集训队2012]tree(陈立杰) 题目 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. INPUT 第一行V,E,need分别表示 ...

  2. [国家集训队2012]middle(陈立杰)

    我是萌萌的传送门 我是另一个萌萌的传送门 脑残错误毁一下午…… 其实题解早就烂大街了,然而很久之前我只知道是二分答案+主席树却想不出来这俩玩意儿怎么一块儿用的……今天又翻了几篇题解才恍然大悟,是把权值 ...

  3. [COGS 1799][国家集训队2012]tree(伍一鸣)

    Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...

  4. 洛谷.2619.[国家集训队2]Tree I(带权二分 Kruskal)

    题目链接 \(Description\) 给定一个无向带权连通图,每条边是黑色或白色.求一棵最小权的恰好有K条白边的生成树. \(Solution\) Kruskal是选取最小的n-1条边.而白边数有 ...

  5. 数据结构(动态树):[国家集训队2012]tree(伍一鸣)

    [问题描述] 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原 ...

  6. cogs1799 [国家集训队2012]tree(伍一鸣)

    LCT裸题 注意打标记之间的影响就是了 这个膜数不会爆unsigned int #include<cstdio> #include<cstdlib> #include<a ...

  7. P2619 [国家集训队2]Tree I(最小生成树+二分)

    P2619 [国家集训队2]Tree I 每次二分一个$x$,每条白边加上$x$,跑最小生成树 统计一下满足条件的最小值就好了. to me:注意二分不要写挂 #include<iostream ...

  8. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  9. [国家集训队2012]middle

    http://cogs.pro:8080/cogs/problem/problem.php?pid=1763 二分答案x 把区间内>=x的数设为1,<x的数设为-1 左端点在[a,b]之间 ...

随机推荐

  1. DateTime格式转换结果

    Console.WriteLine(string.Format("ToLongDateString:{0}", DateTime.Now.ToLongDateString())); ...

  2. 硬盘的结构和介绍,硬盘MBR详细介绍(超详细彩图)

    一.物理结构 1.磁道,扇区,柱面和磁头数 硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等.每个盘片有两面,都可记录信息.盘片被分成许多扇形的区域,每个区域叫一 ...

  3. Android零基础入门第23节:ImageButton和ZoomButton使用大全

    原文:Android零基础入门第23节:ImageButton和ZoomButton使用大全 上一期我们学习了ImageView的使用,那么本期来学习ImageView的两个子控件ImageButto ...

  4. Delphi调用爷爷类的方法(重新构造TMethod的data和code部分,其中Code指向祖父类的方法)

    Delphi通过inherited 可以调用父类的方法,但是没有提供直接调用父类的父类的方法(爷爷类),通过变通的方式实现如下: 假设父类是TFather,爷爷类TGrand,调用爷爷类的Write方 ...

  5. Solr Principal - 工作原理/机制

    From http://lucene.apache.org/solr/guide/7_1/overview-of-documents-fields-and-schema-design.html The ...

  6. Ubuntu Linux服务器搭建SSL/TLS(https)(在StartSSL可以得到免费证书)

    目录 1 生成公钥和私钥对 2 公钥提交到CA机构签发一个crt证书 3 配置证书链 4 在Apache里开启SSL支持并配置crt证书和私钥 5 配置HSTS (可选) 6 总结 首先SSL/TLS ...

  7. WebBrowser执行脚本和调用外部方法

    控制WebBrowser实际上就是控制IE,最简单的方法就是执行javascript或vbscript,省去了接口的转换.如何执行脚本?以前我一直用mshtml中IHTMLWindow2接口的exec ...

  8. 只言片语 - cell 图片复用问题

    一. 今日做项目遇到图片复用问题,返回cell高度相同,由于网络不好出现图片复用,发现问题   Cell 图片加载方法如下: - (void)sd_setImageWithURL:(NSURL *)u ...

  9. Linux 下配置 phpredis 的过程和遇到的问题

    其实对于 Linux 系统和 LNMP 环境并不是很熟,如果有错误请指正. 一.关于 PHP PHP 的编译参考了此文:http://blog.aboutc.net/linux/65/compile- ...

  10. Spring中如何获取request的方法汇总及其线程安全性分析

    前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性.下面话不多说了,来一起看看详细的介绍吧. 概述 在使用Spring MVC开发Web系统 ...