Time Limit: 30 Sec Memory Limit: 512 MB

  

Description

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

Input

  
  ​ 第一行V,E,need分别表示点数,边数和需要的白色边数。
  
  ​ 接下来E行,每行s,t,c,col表示这边的端点(点从0开始标号),边权,颜色(0白色1黑色)。
  

Output

  
​   一行表示所求生成树的边权和。
  
  ​ V<=50000,E<=100000,所有数据边权为[1,100]中的正整数。
  

Sample Input

  
​   2 2 1
​   0 1 1 1
​   0 1 2 0
  

Sample Output

  
​   2
  
  
      
  
  

Solution

  
​   乍一看无从下手。可是我完全没有想到那道强化版的题目。
  
​   若直接求生成树,我们没办法保证白边的数量符合要求。
  
​   如何影响白边的选择?我们尝试对所有白边的权值加上一个偏移值\(d\)。令\(f(d)\)为偏移值为\(d\)被选择的白边数量,可以发现\(f(d)\)随着\(d\)的增长单调不增。这个函数可二分。
  
​   于是我们可以二分出当\(f(d)=need\)时\(d\)的值。最小生成树对边进行排序时,对于相同权值的边,我们优先选择白边。令\(g(d)\)为偏移值为\(d\)时最小生成树的权值,则\(ans=g(d)-d*use\),其中\(use\)是最小生成树中白边的数量。
  
​   可是\(f(d)\)有可能在\(need\)处不连续,我们会二分到形如\(f(d)>need\)且\(f(d+1)<need\)的情况,二分值夹着答案,怎么办?
  
​   注意到我们的对于边的排序方法是若权值相同,白边优先。上述情况可以仔细讨论一下:偏移值为\(d\)时,存在若干条权值相同的黑边和白边,我们优先选择了白边,因而导致\(f(d)>need\),当偏移值为\(d+1\)时,原来的这些黑边和白边被强行分开了,因为白边权值大了一些,排到了后面去,因此我们优先选完了前面的这些黑边,导致了\(f(d)<need\)。
  
​   (注意这里讨论的边不会涉及到其他权值的边,因为根据我们的排序,当偏移值+1时只会影响到这些边)
  
​   所以如今我们只能强行将偏移值为\(d\)时的一些白边用同权值的黑边来替代。
  
​   即\(ans=g(d)-d*f(d)+d*(f(d)-need)=g(d)-d*need\)。
  
​   所以二分得到\(d\)为\(f(d)>=need\)的最大值,按上述式子计算即可。
  

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=50005,M=100005,INF=1000000000;
int n,m,need;
int bl[N];
struct Edge{int u,v,w,c;}e[M];
inline bool cmp(const Edge &a,const Edge &b){if(a.w!=b.w)return a.w<b.w;return a.c<b.c;
}
inline int find(int x){return bl[x]==x?x:(bl[x]=find(bl[x]));}
int MST(int &res){sort(e+1,e+1+m,cmp);for(int i=1;i<=n;i++) bl[i]=i;int sum=0,wsum=0;res=0;for(int i=1;i<=m&&sum<n-1;i++){int u=find(e[i].u),v=find(e[i].v);if(u==v) continue;  sum++;wsum+=e[i].w;bl[u]=v;res+=e[i].c==0;     }return wsum;
}
int calc(int delta,int &use){int tot=0;for(int i=1;i<=m;i++)if(e[i].c==0) e[i].w+=delta,tot++;int res=MST(use);       for(int i=1;i<=m;i++)if(e[i].c==0) e[i].w-=delta;return res;
}
int main(){scanf("%d%d%d",&n,&m,&need);n++;for(int i=1;i<=m;i++){int u,v,w,c;scanf("%d%d%d%d",&u,&v,&w,&c);u++; v++;e[i]=(Edge){u,v,w,c};}int l=-110,r=110,mid,use;while(l<=r){mid=(l+r)>>1;calc(mid,use);if(use>=need) l=mid+1;else r=mid-1;}int ans=calc(r,use);printf("%d\n",ans-r*need);return 0;
}

转载于:https://www.cnblogs.com/RogerDTZ/p/8879643.html

【BZOJ2654】tree相关推荐

  1. 【CF791D】tree 柠檬树

    [题目描述] Herobrine能掌控所有,除了他内心的那棵柠檬树. 他每看到一件让自己心生羡慕的事,他内心的柠檬树上就会多长出一只多汁美味的柠檬. 现在,Herobrine有一棵含有n只柠檬的柠檬树 ...

  2. 【windows】【linux】tree命令

    前言 windows和linux都有tree命令,主要功能是创建文件列表,将所有文件以树的形式列出来 打印目录树 window中使用tree命令 来个tree命令 cmd> tree C:\ 命 ...

  3. 【EasyUI】Tree中自定义在节点前是否显示checkbox

    参考:https://blog.csdn.net/qq_40529542/article/details/90729145 在tree中利用checkbox显示复选框时,发现每个节点前面都有,如图所示 ...

  4. 【LCT】Tree II(luogu 1501)

    Tree II luogu 1501 题目大意 给出一棵树,让你进行若干操作,操作如下: 1.把两个点路径上的所有点权值加k 2.把两个点路径上的所有点权值乘k 3.把一条边断开,连上另一条边 4.查 ...

  5. div获取第一个子节点jquery_【antd】Tree组件子节点不完全勾选获取父节点的值

    注意⚠️:这篇文章适用于后台返回的树结构比较多的情况下,如果数据比较少的情况下,可以参考我的上一篇文章,操作起来比较简单 我们在实际操作tree组件和后台交互的时候一般都是需要将父节点传过去,如图:点 ...

  6. 【CF1092F】 Tree with Maximum Cost

    题目 题目描述 You are given a tree consisting exactly of nn vertices. Tree is a connected undirected graph ...

  7. 【XSY3163】Tree Ext【二分】【最小生成树】【矩阵树定理】【拉格朗日插值】

    给一张 n 个点 m 条边的无向连通图,每条边是黑边或白边 ,有边权.问有多少棵恰好有k条白边,且在此前提下边权和最小的生成树.mod 1e9+7. 首先看一看这道题. ACM Live Archie ...

  8. 【BZOJ2212】【POI2011】Tree Rotations(线段树合并)

    Description click me Solution 对于每个节点有一棵权值线段树,向上递归时合并同时计算逆序对即可. Source /***************************** ...

  9. 【BZOJ2631】tree (LCT)

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2631 终于学了LCT惹qwq (看的板是黄学长的orzzz T了很久发现窝开了个ch[MaxN ...

  10. 【图论】Tree之最小方差树(bzoj 3754)

    正题 bzoj 3754 题目大意 求最小方差生成树 解题思路 可以枚举数值之和,然后跑最小生成树 每次加25,这样可以提高速度,且如果平均数接近,那么所选的边和答案会相同,再暴力跑一遍即可 code ...

最新文章

  1. 计算机行业越来越卷,AI都会刷LeetCode了,网友:比我强
  2. CTFshow 反序列化 web260
  3. 硬件框图分析、核心元器件参数选定和核心元器件参数选择
  4. Condition总结-CountDownLatch
  5. js数字累加 · 递增动画 - 封装篇
  6. 人生永无止境的意思是什么_人生追求永无止境名言
  7. Spring Data Jpa中的save和saveAndFlush方法
  8. 【extjs6学习笔记】1.9 初始: Mixins
  9. Android通知栏Notification弹出横幅显示的解决方法
  10. premium导入后缀为db_Python 导入txt文件到mongo
  11. jmeter常用功能
  12. EasyUI:datagrid重置排序按钮状态
  13. filepath直接指定到文件名吗_Bash技巧:介绍一个批量复制文件到指定目录的Shell脚本...
  14. 厦门大学信息计算机学院,厦门大学信息科学与技术学院计算机科学系导师介绍:刘向荣...
  15. EN 13329强化木地板规范要求和试验方法
  16. 螃蟹保存方法保存时间_活面包蟹怎么保存?面包蟹能保存多久
  17. C# 学习笔记04-15
  18. 【值得读】自动机器学习: 最新进展综述与开放挑战 | AutoML
  19. 上海财经计算机专业考研,考研择校:魔都的复旦、同济、上财哪个更有前途?看网友怎么说!...
  20. 如何用python获取文献_[python]eutilities获取文献题录

热门文章

  1. Lesson 06 for Plotting in R for Biologists
  2. #565. 「LibreOJ Round #10」mathematican 的二进制(期望 + 分治NTT)
  3. python random 之基础点名器
  4. HDU 1210 Eddy's 洗牌问题(foj1062) || FOJ1050 Number lengths水
  5. BI前端展示工具评估
  6. 自己编写的Java获取CRC16校验码
  7. 高效管理 Android 前台服务
  8. 机器学习实战(2)—— k-近邻算法
  9. Zabbix监控介绍配置zabbix架构
  10. Zookeeper实现简单的分布式RPC框架