【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2654

【题目大意】

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

【题解】

  我们发现对于选中的边白色是从小到大的,黑色也是从小到大的,
  因此我们对所有的白色边加一个权值,那么排序后做mst选取的白色边数量增减性单调,
  对于增加的权值进行二分,验证能否满足要求即可。

【代码】

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=100010;
struct data{int a,b,u,c;}p[N];
bool cmp(data a,data b){return a.u<b.u;}
int ans,res,v,e,need,f[N];
int sf(int x){return f[x]==x?x:f[x]=sf(f[x]);}
bool check(int x){
int cnt=0; res=0;
for(int i=0;i<v;i++)f[i]=i;
for(int i=1;i<=e;i++){if(!p[i].c)p[i].u+=x;}
sort(p+1,p+e+1,cmp);
for(int i=1;i<=e;i++){if(!p[i].c)p[i].u-=x;}
for(int i=1;i<=e;i++){
if(p[i].u<x)continue;
if(sf(p[i].a)!=sf(p[i].b)){
res+=p[i].u;
f[sf(p[i].a)]=sf(p[i].b);
cnt+=(p[i].c==0);
}
}return cnt>=need;
}
int main(){
while(~scanf("%d%d%d",&v,&e,&need)){
for(int i=1;i<=e;i++){scanf("%d%d%d%d",&p[i].a,&p[i].b,&p[i].u,&p[i].c);}
int l=-100,r=100;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid))l=mid+1,ans=res;
else r=mid-1;
}printf("%d\n",ans);
}return 0;
}

最新文章

  1. 转载:《TypeScript 中文入门教程》 14、输入.d.ts文件
  2. 【BZOJ-1853&amp;2393】幸运数字&amp;Cirno的完美算数教室 容斥原理 + 爆搜 + 剪枝
  3. js 对象属性复制到另一个对象
  4. LeetCode OJ-- Remove Element
  5. ArcGis 获取地理、平面坐标系
  6. 把字符串添加到HashMap中
  7. slf4j提示Class path contains multiple SLF4J bindings
  8. Ruby自学笔记(一)— 基本概况
  9. requireJS基础使用
  10. 用Verilog语言实现一个简单的MII模块
  11. [数据算法]D1.BloomFilter
  12. GitLab管理之 - Gitlab 用户管理
  13. 【LeetCode每天一题】Next Permutation(下一个排列)
  14. C program basic
  15. 启用Flash Player 11.3的全屏键盘输入注意事项
  16. 导入maven项目遇到中文乱码
  17. Linux命令(八)过滤文本 grep
  18. 访问修饰符---java基础总结
  19. PhotoShop CS6学习笔记
  20. php json_decode无法解析特殊问好字符

热门文章

  1. 完全背包问题入门 (dp)
  2. Linux 入门记录:十七、Linux 命令行文本/文件处理工具
  3. python实战===老司机奇技淫巧系列之字符转换成图片
  4. perl多线程tcp端口扫描器(原创)
  5. 【bzoj4551】TJOI2016&amp;HEOI2016树
  6. mysql 安装和配置
  7. XML、java解释XML、XML约束
  8. hihocoder 1177 : 顺子
  9. Mybatis学习—入门
  10. initWithFrame和initWithCoder的区别