BZOJ2654 & 洛谷2619:tree——题解
2024-09-26 22:44:18
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/ +
+++++++++++++++++++++++++++++++++++++++++++
最新文章
- Linux PXE无盘工作站
- GoDaddy自动续费信用卡被扣款后的退款方法
- 说不尽的MVVM(2) &ndash; MVVM初体验
- HRBUST1530
- ping 以及 traceroute 用法
- 利用BlazeDS的AMF3数据封装与Flash 进行Socket通讯
- 驱动之路-platform简例按键驱动☆☆☆
- NOIP2006 2k进制数
- 浅谈android应用性能之内存(转)
- Android学习之Intent传递数据
- CentOS安装常用软件
- javascript技术难点之this、new、apply和call详解
- 多条件搜索拼接Sql语句
- Android官方技术文档翻译——Gradle 插件用户指南(6)
- OpenShift实战(七):OpenShift定制镜像S2I
- js 将内容复制到剪切板上
- Django商城项目笔记No.11用户部分-QQ登录1获取QQ登录网址
- Mysql(二)函数与连接
- 通过HTTP协议发送远程消息
- nginx访问http自动跳转到https
热门文章
- 阿里otter使用问题汇总
- JDK1.8改为JDK1.7过程
- Visual Studio 2015 Test Explorer does not show anything
- 用python读取配置文件config.ini
- Appium(Python)驱动手机Chrome浏览器
- Linux命令应用大词典-第4章 目录和文件操作
- 进度条加载与案例优化对比——python使用perf_count方法实现
- spark写入ES(动态模板)
- java基础-Comparator接口与Collections实现排序算法
- 【shell 每日一练6】初始化安装Mysql并修改密码