Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
题意
题目描述
给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有\(need\)条白色边的生成树。
题目保证有解。
输入输出格式
输入格式:
第一行\(V,E,need\)分别表示点数,边数和需要的白色边数。
接下来\(E\)行
每行\(s,t,c,col\)表示这边的端点(点从\(0\)开始标号),边权,颜色(\(0\)白色\(1\)黑色)。
输出格式:
一行表示所求生成树的边权和。
输入输出样例
输入样例#1:
2 2 1
0 1 1 1
0 1 2 0
输出样例#1:
2
说明
\(0:V<=10\)
\(1,2,3:V<=15\)
\(0,..,19:V<=50000,E<=100000\)
所有数据边权为\([1,100]\)中的正整数。
\(By\ WJMZBMR\)
思路
\(WQS\)二分真的强。
定义一个东西\(delta\),把它加在所有白边的边权上。对原图直接跑最小生成树,如果白边少了,就调小\(delta\);反之,则调大\(delta\)。最后得到答案。
证明并不会,只会感性理解(毕竟我是蒟蒻)。安利一篇博客好了:关于WQS二分算法以及其一个细节证明 --Creeper_LKF。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e4+4,MAXM=1e5+5;
int n,m,ned,ans,tot,fa[MAXN];
struct Edge
{
int u,v,d,col;
bool operator < (const Edge &sjf) const
{
if(d!=sjf.d) return d<sjf.d;
return col<sjf.col;
}
}edge[MAXM];
int read()
{
int re=0;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) re=(re<<3)+(re<<1)+ch-'0',ch=getchar();
return re;
}
int fd(int x)
{
int r=x;
while(r!=fa[r]) r=fa[r];
int i=x,j;
while(i!=r) j=fa[i],fa[i]=r,i=j;
return r;
}
bool check(int lzq)
{
for(int i=0;i<m;i++) if(!edge[i].col) edge[i].d+=lzq;
for(int i=0;i<n;i++) fa[i]=i;
int white=0,cnt=1;tot=0;
sort(edge,edge+m);
for(int i=0;i<m;i++)
{
int x=edge[i].u,y=edge[i].v;
if(fd(x)==fd(y)) continue;
fa[fd(x)]=fd(y),cnt++,tot+=edge[i].d,white+=(!edge[i].col);
if(cnt==n) break;
}
for(int i=0;i<m;i++) if(!edge[i].col) edge[i].d-=lzq;
return white>=ned;
}
int main()
{
n=read(),m=read(),ned=read();
for(int i=0;i<m;i++) edge[i].u=read(),edge[i].v=read(),edge[i].d=read(),edge[i].col=read();
int L=-15000,R=15000;
while(L<=R)
{
int M=(L+R)>>1;
if(check(M)) L=M+1,ans=tot-M*ned;
else R=M-1;
}
printf("%d",ans);
return 0;
}
Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)的更多相关文章
- p2619 [国家集训队2]Tree I [wqs二分学习]
分析 https://www.cnblogs.com/CreeperLKF/p/9045491.html 反正这个博客看起来很nb就对了 但是不知道他在说啥 实际上wqs二分就是原来的值dp[x]表示 ...
- luogu P2619 [国家集训队2]Tree I
题目链接 luogu P2619 [国家集训队2]Tree I 题解 普通思路就不说了二分增量,生成树check 说一下坑点 二分时,若黑白边权有相同,因为权值相同优先选白边,若在最有增量时出现黑白等 ...
- Luogu P2619 [国家集训队2]Tree I 凸优化,wqs二分
新学的科技.设\(f(x)\)为选\(x\)条白色边的时候的最小生成树权值和,那么可以猜到它应该是一个下凸函数的形式. 如图,图中\(x\)坐标表示选的白色边条数,\(y\)坐标表示获得的权值,那么我 ...
- P2619 [国家集训队2]Tree I(最小生成树+二分)
P2619 [国家集训队2]Tree I 每次二分一个$x$,每条白边加上$x$,跑最小生成树 统计一下满足条件的最小值就好了. to me:注意二分不要写挂 #include<iostream ...
- 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)
洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...
- P2619 [国家集训队2]Tree I
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- luogu P2757 [国家集训队]等差子序列
题目链接 luogu P2757 [国家集训队]等差子序列 题解 线段树好题 我选择暴力 代码 // luogu-judger-enable-o2 #include<cstdio> inl ...
- [国家集训队2012]tree(陈立杰)
[国家集训队2012]tree(陈立杰) 题目 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. INPUT 第一行V,E,need分别表示 ...
- [Luogu P1829] [国家集训队]Crash的数字表格 / JZPTAB (莫比乌斯反演)
题面 传送门:洛咕 Solution 调到自闭,我好菜啊 为了方便讨论,以下式子\(m>=n\) 为了方便书写,以下式子中的除号均为向下取整 我们来颓柿子吧qwq 显然,题目让我们求: \(\l ...
随机推荐
- NX二次开发-UFUN点收集器UF_UI_select_point_collection
#include <uf.h> #include <uf_ui.h> UF_initialize(); //点收集器 char sMessage[] = "点收集器& ...
- DZY LOVES MATH (莫比乌斯反演)
OK!开始更新莫比乌斯反演 先看了一下数据范围,嗯,根据\(jiry\)老师的真言,我们一定是可以筛一遍然后用根号或者是\(log\)的算法. 题目思路挺简单,就是把原始的式子化成: \(\sum_{ ...
- 数据结构C++版-图
一.概念及分类 二.图的存储结构 1.邻接矩阵 顶点: 弧: 边: 表达式语句: 2.邻接表 逆邻接表: 3.十字链表 4.邻接多重表 三.图的权值概念及遍历 权值: 图的遍历: 1.深度优先搜索 2 ...
- 隐藏tomcat页面异常显示的版本信息
1.正常情况下,tomcat遇到404或500会返回版本信息: 2.有时我们不需要暴露版本信息,像这样: 3.只需要修改apache-tomcat-7.0.59的lib目录下的catalina.jar ...
- (转)python之函数介绍及使用
为什么要用函数? 1.减少代码量 2.保持一致性 3.易维护 一.函数的定义和使用 ? 1 2 3 4 5 6 def test(参数): ... 函数体 . ...
- ncurse 笔记
初始化与结束 为了使用 NCURSES 库,你应该 #include <curses.h>,在编译时,应该加上 -lncurses. stdscr 一般地,第一个函数调用必须是 inits ...
- 把Debian 设置中文环境
要支持区域设置,首先要安装locales软件包: apt-get install locales 然后配置locales软件包: dpkg-reconfigure locales 在界面中钩选上“zh ...
- Spark 调优之ShuffleManager、Shuffle
Shuffle 概述 影响Spark性能的大BOSS就是shuffle,因为该环节包含了大量的磁盘IO.序列化.网络数据传输等操作. 因此,如果要让作业的性能更上一层楼,就有必要对 shuffle 过 ...
- MySQL数据库中,使用 group by 时,不重复字段如何拼接显示
就不写文字描述了,直接用图和sql来表述吧. 这是测试数据,表名为 person 现在,我想按照性别进行分组,也就是字段 sex ,同时能将分组后的姓名全部显示出来. sql 语句如下: SELECT ...
- sift-高斯金字塔
一.高斯金字塔 金字塔的层是由降采样得到的,而每一层又有多张图像,其他的图像是由初始的一张经过高斯模糊的得到的. 注意的是:高斯金字塔有层,而金字塔的每一层有一组图像,这一组图像也形成了层.注意两个层 ...