P2619 [国家集训队]Tree I(K 度限制生成树 二分)

P2619 [国家集训队]Tree I

一张 \(n\) 个点 \(m\) 条边的带权无向联通图,每条边是黑色或白色。求一棵最小权的恰好有 \(need\) 条白色边的生成树,题目保证有解。

\(n\le 5\times 10^4,m\le 10^5,val\in[1,100]\)

\(\color{yellow}{\bigstar\texttt{Trick}}\):这种限制选择 \(need\) 个物品的问题可以考虑 WQS 二分(或者直接叫 二分???)

将所有白边从小到大排序后,每条边权值加上一个 \(x\) 之后再进行最小生成树。

可以发现随着增加值 \(x\) 的增大,我们选择的白边的数量不断减少,完全可以二分找到最接近选择 \(need\) 条白边的那个 \(x\)

那么我们二分 \(k\),如果发现 \(chose>need\),就增大 \(k\),否则减小 \(k\)

代码实现的时候有一个细节上的小技巧:二分不一定能够准确的二分到 \(need\),这是因为有白边和黑边权值相同,取到了黑边。

不妨先二分出最接近 \(need\) 的一个 \(x\),由于题目保证有解,此时多出来的白边一定有相同权值的黑边可以代替

为什么?若不存在相同权值的黑边可以代替,我们选择 \(need\) 数量的白边必须要舍弃较小权值 \(wh\) 的白边再选择较大权值 \(bl\) 的黑边,确保交换的 \(bl-wh\) 最小。那么完全可以在二分的时候 \(x\) 变为 \(x+bl-wh+1\),使得二分后这条 \(bl\) 黑边就在 \(wh\) 白边后面(一定不存在新的替换,因为 \(bl-wh\) 最小),这使得二分出选择的白边数量减少 \(1\),与一开始二分出的白边数量最接近与 \(need\) 矛盾,不成立。因此一定存在相同权值的黑边可以替代。

只用将白边与黑边权值相同时钦定白边优先,这样可以将一些的白边“替换”为黑边(贡献不变,意会即可)。

此题代码
// 白边是 0,黑边是 1。
#define Maxn 50005
#define Maxm 100005
int n,m,ned,cnt0,cnt1,ans=inf,Now,mid;
int fa[Maxn];
struct EDGE
{int u,v,c,opt;EDGE(int U=0,int V=0,int C=0,int OPT=0):u(U),v(V),c(C),opt(OPT){}bool friend operator < (EDGE x,EDGE y){ return (x.c!=y.c)?x.c<y.c:(x.opt<y.opt); }
}wh[Maxm],bl[Maxm],tmp[Maxm];
int Find(int x){ return (fa[x]==x)?x:(fa[x]=Find(fa[x])); }
inline bool merge(int x,int y)
{x=Find(x),y=Find(y);if(x!=y) { fa[x]=y; return true; }return false;
}
inline bool check()
{int used=0;for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=cnt0;i++) wh[i].c+=mid;merge(bl+1,bl+cnt1+1,wh+1,wh+cnt0+1,tmp+1);for(int i=1;i<=m;i++) if(merge(tmp[i].u,tmp[i].v))Now+=tmp[i].c,used+=(tmp[i].opt^1);for(int i=1;i<=cnt0;i++) wh[i].c-=mid;Now-=mid*ned;return used>=ned;
}
int main()
{n=rd(),m=rd(),ned=rd();for(int i=1,s,t,c,col;i<=m;i++){s=rd()+1,t=rd()+1,c=rd(),col=rd();if(!col) wh[++cnt0]=EDGE(s,t,c,0);else bl[++cnt1]=EDGE(s,t,c,1);}sort(wh+1,wh+cnt0+1),sort(bl+1,bl+cnt1+1);int nl=-101,nr=101;while(nl<=nr){mid=(nl+nr)>>1,Now=0;if(check()) nl=mid+1,ans=Now;else nr=mid-1;}printf("%d\n",ans);return 0;
}

P5633 最小度限制生成树

其实就是上面的弱化为限制单点相邻的白边数量,但是增添了无解的情况

无解可以这样判断:将于这个点相邻的边全部断开,如果分开后连通块数量 \(>need\) 则无解,其他一定有解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSP2021提高组复赛解析

前言 终于出成绩了我可以写博客辣&#xff0c;官方数据还没出就先放洛谷的题目链接了。 正题 T1-廊桥分配 https://www.luogu.com.cn/problem/P7913 题目大意 有m1m_1m1​种一类飞机&#xff0c;m2m_2m2​种二类飞机&#xff0c;每个飞机有一个占用时间的区间。要给两类飞机…

一起开心集训队第一周训练赛2021/3/14

文章目录比赛链接A CodeForces 1481D AB Graph题意&#xff1a;题解&#xff1a;代码&#xff1a;B CodeForces 1481E Sorting Books题意&#xff1a;题解&#xff1a;代码&#xff1a;C CodeForces 1478D Nezzar and Board题意&#xff1a;题解&#xff1a;代码&#xff1a;D …

9.27模拟:至暗时刻

黑暗使人清醒 前言 15pts 00150 总的来说&#xff0c;就是能切的没切掉&#xff0c;不该挂的分全挂了 呜呜呜 考场 先看题 有构造专题那味了 感觉题目都好奇怪啊… 似乎T1看起来相对比较水的样子 T2感觉可能是奇怪的模型&#xff0c;也许可做&#xff1f; T3这是甚么玩意。。…

使用Azure DevOps持续集成GitHub项目

点击蓝字关注我微软的Azure DevOps是一款软件开发管理工具&#xff0c;整合了需求、代码、编译、测试、发布等所有功能于一身。今天我们就来看看如何用Azure DevOps对自己GitHub上的项目做持续集成&#xff0c;并能在GitHub显示最新编译状态。其实在不久之前&#xff0c;Azure …

[BZOJ 3811]玛里苟斯(线性基)尽量理解的题解

文章目录titlesolutioncodetitle 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心&#xff0c;于是他想了一道数学题。 S 是一个可重集合&#xff0c;S{a1,a2,…,an}。 等概率随机取 S 的一个子集 A{ai1,…,aim}。 计算出 A 中所有元素异或和&#xff0c;记为 x, 求 x^…

CF464E The Classic Problem(线段树 最短路)

CF464E The Classic Problem \(\bigstar\texttt{Hint}\)&#xff1a;发现没有什么好的突破口&#xff1f;为什么不想想怎样才能实现题目中 \(2^x\) 的加减法呢&#xff1f; 可见每次加减法&#xff0c;我们要做的是将添加的 \(1\) 和右边的连续的 \(1\) 合并为一整段&#xff0…

9.28模拟

fuckingqytandAstaAKIOI\texttt{fucking qyt and Asta AK IOI}fucking qyt and Asta AK IOI 前言 200pts&#xff08;lemon&#xff09;01001000 340pts&#xff08;996&#xff09;10010010040 T4是lemon的数据锅掉了 T1本地洛谷996都能过&#xff0c;lemon蜜汁RE。。。 枯了…

C. Longest Simple Cycle

C. Longest Simple Cycle 题意&#xff1a; 有n条链&#xff0c;第i条链上有c[i]个点&#xff0c;a[i]为第i条链的顶点与第i-1条链的连接点&#xff0c;b[i]为第i条链的最后一个点与第i-1条链的连接点。通过上面的方法连接链会产生很多的环&#xff0c;问这些环的最大长度。 …

【CF813F】Bipartite Checking(线段树分治+可删除并查集)

文章目录titlesolutioncodetitle You are given an undirected graph consisting of n vertices. Initially there are no edges in the graph. Also you are given q queries, each query either adds one undirected edge to the graph or removes it. After each query you…

在.Net Core WebAPI下给Swagger增加导出离线文档功能

一丶前言最近刚接触到Swagger&#xff0c;在github上下载了它的源码和demo学习了一遍&#xff0c;发现这个组件非常好用&#xff0c;不过不足的是它没有导出离线文档的功能&#xff0c;于是乎我就想给它加一个导出功能Swagger Github开源地址二丶思路其实说白了api文档就是一个…

P7920-[Kubic]Permutation

正题 题目链接:https://www.luogu.com.cn/problem/P7920 题目大意 一个排列ppp生成的森林的形式如下&#xff0c;对于每个iii找到最大的j∈[1,i)j\in [1,i)j∈[1,i)满足 pi>pjp_i>p_jpi​>pj​&#xff0c;然后连一条i,ji,ji,j之间的边。 给出一张树GGG&#xff0c;…

YBTOJ洛谷P4331:数字序列(左偏树)

文章目录题目描述数据范围解析代码题目描述 数据范围 n<1e6n<1e6n<1e6 解析 先考虑简单情况 如果原数列是单调递增的&#xff0c;显然应该使biaib_ia_ibi​ai​ 如果单调递减&#xff0c;应该取中位数 那么原数列如果分成单调递减的几段&#xff0c;那么每一段都取中…

P8441 旭日东升(二维数点经典套路)

P8441 旭日东升 维护一个不可重集合的序列 \(a\)&#xff0c;长度为 \(n\)。支持以下两种操作&#xff1a; l r x 对于每个 \(l\le i\le r\)&#xff0c;将 \(x\) 并入 \(a_i\)。l r 设 \(S\) 把每个 \(l\le i\le r\) 的 \(a_i\) 并在一起的集合&#xff0c;输出 \(S\) 中所有元…

深搜、广搜、搜索剪枝

搜索与回溯讲解 文章目录深搜方向向量&#xff1a;DFS代码&#xff1a;题目讲解&#xff1a;八皇后问题字符序列自然数的拆分广搜BFS代码&#xff1a;题目讲解&#xff1a;瓷砖关系网络bfs与dfs的用途与区别搜索剪枝可行性剪枝最优性剪枝记忆化搜索搜索顺序剪枝题目&#xff1a…

使用logdashboard查看可视化日志

logdashboard日志面板是我在Github写的一个开源项目&#xff0c;旨在让查看日志变的方便快捷。在线预览现在功能有日志检索、趋势图、异常堆栈快速查看、日志详情等logdashboard支持自定义日志模型可以记录更多自定义的属性。logdashboard支持的日志来源有以下两种&#xff0c;…

CF1603C-Extreme Extension【整除分块,dp】

正题 题目链接:http://codeforces.com/contest/1603/problem/C 题目大意 定义一个序列aaa的f(a)f(a)f(a)为你每次可以将序列中的一个数zzz分裂成xyzxyzxyz&#xff0c;然后再把x,yx,yx,y放回原来的位置&#xff0c;然后f(a)f(a)f(a)表示把aaa变成不降序列的最少操作次数 给出…

数论分块专题复习(余数求和+模积和+Ice Rain+The Fool)

文章目录前提知识复习T1&#xff1a;余数求和titlesolutioncodeT2&#xff1a;Ice RaintitlesolutioncodeT3&#xff1a;The FooltitlesolutioncodeT4&#xff1a;模积和titlesolutioncode前提知识复习 整除分块是用于快速处理形似下列式子的方法&#xff0c;是解决莫比乌斯反…

SP1557 GSS2 - Can you answer these queries II(离线 线段树)

SP1557 GSS2 - Can you answer these queries II \(\bigstar\texttt{Hint}\)&#xff1a;遇到去重的问题&#xff0c;我们通常考虑离线询问后处理。 可以枚举右端点&#xff0c;将询问存储在右端点&#xff0c;考虑用数据结构记录左端点的信息。 那么我们如果用线段树维护左端点…

模板:K-D tree

文章目录前言思想能解决的问题操作建树询问修改完整代码所谓KDtree&#xff0c;就是有K个D的树 &#xff08;逃&#xff09; 前言 KDtree是一种解决多维问题的暴力数据结构 K维状态下的最差复杂度是nk−1/kn^{k-1/k}nk−1/k 在最常见的2Dtree中就是根号n 但是玄学的它常常能到…

AT3877-[ARC089C]GraphXY【构造】

正题 题目链接:https://www.luogu.com.cn/problem/AT3877 题目大意 给出一个大小为ABA\times BAB的矩阵ddd 要求构造一个点数不超过300300300的有向图满足 图中没有重边和自环图中的边权为[0,100][0,100][0,100]的整数或者未知数X/YX/YX/Y对于所有X∈[1,A],Y∈[1,B]X\in[1,A…