题目链接

\(Description\)

给定一个无向带权连通图,每条边是黑色或白色。求一棵最小权的恰好有K条白边的生成树。

\(Solution\)

Kruskal是选取最小的n-1条边。而白边数有限制,考虑为其设额外边权C。

随着C增大,选的白边数应是不增的。可以二分求一个C值使得此时恰好选择K条边。选取时应优先选白边,因为多了还可以用黑边替换,少了只能减少C。

可能的问题是,C=mid时白边数>K,C=mid+1时白边数<K,因为有很多黑边与+mid后的白边权值想等。可以用这些黑边替换掉多余的白边,所以答案应是减K*mid(保留黑边)。

//404ms	3.36MB
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 100000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int N=5e4+5,M=1e5+5; int n,m,K,fa[N],Ans;
char IN[MAXIN],*SS=IN,*TT=IN;
int read();
struct Edge
{
int fr,to,val,col;
inline void Init(){
fr=read()+1, to=read()+1, val=read(), col=read();
}
bool operator <(const Edge &x)const{
return val==x.val?col<x.col:val<x.val;
}
}e[M]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int GetFa(int x){
return x==fa[x]?x:fa[x]=GetFa(fa[x]);
}
bool Check(int x)
{
for(int i=1; i<=m; ++i) if(!e[i].col) e[i].val+=x;
for(int i=1; i<=n; ++i) fa[i]=i;
std::sort(e+1,e+1+m);
int sum=0, cnt=0;
for(int i=1,k=0,r1,r2; i<=m; ++i)
{
if((r1=GetFa(e[i].fr))==(r2=GetFa(e[i].to))) continue;
fa[r1]=r2, sum+=e[i].val;
cnt+=e[i].col^1;
if(++k+1==n) break;
}
for(int i=1; i<=m; ++i) if(!e[i].col) e[i].val-=x;
if(cnt<K) return 0;
Ans = sum-K*x;//不能取min!
return 1;
} int main()
{
n=read(),m=read(),K=read();
for(int i=1; i<=m; ++i) e[i].Init();
Ans=m*101; int l=-101,r=101,mid;
while(l<=r)//l==r时要Check一遍(或者结束时)
if(Check(mid=l+r>>1)) l=mid+1;
else r=mid-1;
// Check(l);
printf("%d",Ans); return 0;
}

洛谷.2619.[国家集训队2]Tree I(带权二分 Kruskal)的更多相关文章

  1. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

  2. 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)

    洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...

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

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

  4. 洛谷 P1501 [国家集训队]Tree II 解题报告

    P1501 [国家集训队]Tree II 题目描述 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\( ...

  5. 洛谷P1501 [国家集训队]Tree II(LCT,Splay)

    洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...

  6. [洛谷P1527] [国家集训队]矩阵乘法

    洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...

  7. 洛谷 P1505 [国家集训队]旅游 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 AC代码 总结 题面 题目链接 P1505 [国家集训队]旅游 题目描述 Ray 乐 ...

  8. 洛谷 P1407 [国家集训队]稳定婚姻 解题报告

    P1407 [国家集训队]稳定婚姻 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的 ...

  9. 洛谷 P1852 [国家集训队]跳跳棋 解题报告

    P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...

随机推荐

  1. Electron 开发环境下总是 crash

    全局安装一个 electron devtool 关掉 崩溃时选择重新打开

  2. python+selenium初学者常见问题处理

    要做web自动化,第一件事情就是搭建自动化测试环境,那就没法避免的要用到selenium了. 那在搭建环境和使用过程中经常会遇到以下几类问题: 1.引入selenium包失败: 出现这种错误,一般分为 ...

  3. 洛谷 P4559: bzoj 5319: [JSOI2018]军训列队

    题目传送门:洛谷 P4559. 题意简述: 有 \(n\) 个学生,编号为 \(i\) 的学生有一个位置 \(a_i\). 有 \(m\) 个询问,每次询问编号在 \([l,r]\) 区间内的学生跑到 ...

  4. python的新特性

    http://www.jb51.net/article/67699.htm Python中用format函数格式化字符串的用法:http://www.jb51.net/article/63672.ht ...

  5. SqlServer存储过程(增删改查)

    * IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...

  6. nginx配置浅析

    一.nginx的介绍 nginx是由俄罗斯人开发的一款高性能的http和反向代理服务器,也可以用来作为邮件代理.相比较于其他的服务器,具有占用内存少,稳定性高等优势 二.nginx的配置 nginx的 ...

  7. Linux学习笔记-Linux系统简介

    Linux学习笔记-Linux系统简介 UNIX与Linux发展史 UNIX是父亲,Linux是儿子. UNIX发行版本 操作系统 公司 硬件平台 AIX IBM PowerPC HP-UX HP P ...

  8. Nginx - Header详解

    1. 前言 通过 HttpHeadersModule 模块可以设置HTTP头,但是不能重写已经存在的头,比如可能相对server头进行重写,可以添加其他的头,例如:Cache-Control,设置生存 ...

  9. window时间同步机制的简单介绍

    1 window自身现在采用w32tm程序来进行时间校正,window自身携带NTP程序,但默认下时关闭的,默认的NTP时客户端. 2 w32tm时用来代替早期的时钟同步程序net  time 3 w ...

  10. SQLSERVER中的非工作时间不得插入数据的触发器的实现

    create trigger trigger_nameon table_namefor insert,update,deleteasif (datepart(yy,getdate())%4=0 or ...