https://www.lydsy.com/JudgeOnline/problem.php?id=2654

https://www.luogu.org/problemnew/show/P2619

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

在APIO重学了二分……cljls的可怕题目!

如果不知道wqs二分(DP凸优化/带权二分?)的话应该是没什么思路的。

对每条白边加整数w,如果w过小则求得的生成树大部分为白边,反之大部分为黑边。

于是利用这个性质二分w,且正好当符合条件时求得的生成树就正是题目所求得生成树。

为什么呢?显然我们拿的白边是所有白边当中最好的(权值最小的),且由于kruskal的正确性不难知道其正确性。

PS:当边权相等时优先添加白边!

#include<queue>
#include<cmath>
#include<stack>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=;
const int M=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct node{
int u,v,w,c;
}e[M];
int n,m,t,tmp,fa[N];
int find(int x){
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
inline void unionn(int u,int v){
fa[u]=v;
}
inline bool cmp(node a,node b){
return a.w<b.w||(a.w==b.w&&a.c<b.c);
}
void modify(int k){
for(int i=;i<=m;i++){
if(!e[i].c)e[i].w+=k;
}
}
bool pan(int k){
modify(k);
sort(e+,e+m+,cmp);
int num=,cnt=;tmp=;
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=m;i++){
int u=e[i].u,v=e[i].v,w=e[i].w;
u=find(u),v=find(v);
if(u!=v){
unionn(u,v);
cnt++;tmp+=w;
if(!e[i].c)num++;
if(cnt==n-)break;
}
}
modify(-k);
return num>=t;
}
int solve(int l,int r){
int ans;
while(l<r){
int mid=(l+r+)>>;
if(!pan(mid))r=mid-;
else{
l=mid;
ans=tmp-mid*t;
}
}
return ans;
}
int main(){
n=read(),m=read(),t=read();
for(int i=;i<=m;i++){
e[i].u=read()+,e[i].v=read()+;
e[i].w=read(),e[i].c=read();
}
printf("%d\n",solve(-,));
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

最新文章

  1. Linux PXE无盘工作站
  2. GoDaddy自动续费信用卡被扣款后的退款方法
  3. 说不尽的MVVM(2) &ndash; MVVM初体验
  4. HRBUST1530
  5. ping 以及 traceroute 用法
  6. 利用BlazeDS的AMF3数据封装与Flash 进行Socket通讯
  7. 驱动之路-platform简例按键驱动☆☆☆
  8. NOIP2006 2k进制数
  9. 浅谈android应用性能之内存(转)
  10. Android学习之Intent传递数据
  11. CentOS安装常用软件
  12. javascript技术难点之this、new、apply和call详解
  13. 多条件搜索拼接Sql语句
  14. Android官方技术文档翻译——Gradle 插件用户指南(6)
  15. OpenShift实战(七):OpenShift定制镜像S2I
  16. js 将内容复制到剪切板上
  17. Django商城项目笔记No.11用户部分-QQ登录1获取QQ登录网址
  18. Mysql(二)函数与连接
  19. 通过HTTP协议发送远程消息
  20. nginx访问http自动跳转到https

热门文章

  1. 阿里otter使用问题汇总
  2. JDK1.8改为JDK1.7过程
  3. Visual Studio 2015 Test Explorer does not show anything
  4. 用python读取配置文件config.ini
  5. Appium(Python)驱动手机Chrome浏览器
  6. Linux命令应用大词典-第4章 目录和文件操作
  7. 进度条加载与案例优化对比——python使用perf_count方法实现
  8. spark写入ES(动态模板)
  9. java基础-Comparator接口与Collections实现排序算法
  10. 【shell 每日一练6】初始化安装Mysql并修改密码