好神奇的一道题

我们发现给白边加上权值后 跑MST后 选到的白边就越少

然后就二分这个加上的权值

不过边界好像有点恶心?不过没关系 思想最重要

#include<bits/stdc++.h>
#define N 50005
#define M 100005
using namespace std;
struct Edge
{int from,to,color,val;
}edge[M];
template <class T>
inline void read(T &x)
{x=0;static char ch=getchar();while(ch<'0'||ch>'9')   ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
}
int n,m,need,ans;
int l,r,father[N];
inline int getfather(int x)
{if(father[x]==x)    return x;father[x]=getfather(father[x]);return father[x];
}
inline bool cmp(const Edge &x,const Edge &y)
{if(x.val==y.val)    return x.color<y.color;return x.val<y.val;
}
inline bool check(int del)
{for(int i=1;i<=m;i++)   if(edge[i].color==0)    edge[i].val+=del;for(int i=1;i<=n;i++)   father[i]=i;sort(edge+1,edge+m+1,cmp);int white=0,sum=0,cnt=0,flag;for(int i=1;i<=m;i++){int fx=getfather(edge[i].from),fy=getfather(edge[i].to);if(fx!=fy){father[fx]=fy;  sum+=edge[i].val; cnt++;if(edge[i].color==0)    white++;if(cnt==n-1){if(white>=need) ans=sum-del*need,flag=1;else flag=0;break;}}}for(int i=1;i<=m;i++)   if(edge[i].color==0)    edge[i].val-=del;return flag;
}
int main()
{read(n); read(m); read(need);for(int i=1;i<=m;i++){read(edge[i].from); read(edge[i].to); edge[i].from++; edge[i].to++;read(edge[i].val);  read(edge[i].color);r=max(r,edge[i].val+1);}l=-r;while(l<r){int mid=(l+r)/2;if(check(mid)) l=mid+1;else r=mid;}cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/Patrickpwq/articles/9848734.html

【bzoj2654】tree(二分+MST)相关推荐

  1. BZOJ2654: tree 二分答案+最小生成树

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...

  2. WQS二分 学习笔记 + 例题([BZOJ2654]Tree、[联考2018]林克卡特树)

    目录 问题类型 WQS二分思路 形象地说 板题 题意 & 解法 CODE 省选题 题意 & 解法 CODE 问题类型 形如"恰好取 k 个--时的最优答案(并非具体方案)&q ...

  3. 洛谷2619/bzoj2654 Tree(凸优化+MST)

    bzoj的数据是真的水.. qwq 由于本人还有很多东西不是很理解 qwq 所以这里只写一个正确的做法. 首先,我们会发现,对于你选择白色边的数目,随着数目的上涨,斜率是单调升高的. 那么这时候我们就 ...

  4. BZOJ2654:tree(最小生成树,二分)

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...

  5. [BZOJ2654] tree

    2654: tree Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 610  Solved: 225 [Submit][Status][Discus ...

  6. HDOJ 4253 Two Famous Companies 二分+MST

    题目意思:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的.边上有权值, 问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条.题目保证有解. 题解:题目意思很简单就是 ...

  7. BZOJ2654 Tree

    Time Limit: 30 Sec Memory Limit: 512 MB Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生 ...

  8. BZOJ2654: tree(陈立杰)

    2654: tree(陈立杰) Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 229  Solved: 91 [Submit][Status] De ...

  9. [XSY]Tree Ext(矩阵树定理,拉格朗日插值,最小生成树,二分)

    Tree Ext 这道题相当于把3道题合了起来. 要求修复的边中恰好有 k 条白边: 五颜六色的幻想乡(附拉格朗日插值法求多项式系数 ) + bzoj2654 tree(WQS二分 新科技get) 是 ...

  10. BinarySearchTree(二分查找树)

    Don't say much, just go to the code. package org.bood.tree;/*** 二分查找树* ps:如果 data[0] 等于一组数据中最小的,那么就会 ...

最新文章

  1. BM提供支持云的量子计算平台,以加速创新
  2. ubuntu16.04忘了root密码
  3. GIS讲堂第二课-地图切片简介以及OL中的调用
  4. 08_MinNumberInRotateArrary
  5. Python—实训day12—汽车用户消费投诉案例-分析及可视化
  6. oracle的一些基本操作,Oracle中的一些基本操作
  7. 【小梅哥SOPC学习笔记】系统时钟的使用
  8. oracle监听管理工具,oracle监听器管理
  9. 简单的时间间隔调度任务
  10. 二分查找算法详解(折半查询)
  11. 计算机图形学_GAMES101-现代计算机图形学课程 全笔记
  12. 微信内提示浏览器打开遮罩层
  13. emule最新服务器地址,emule更新服务器列表
  14. 音频格式转换器哪个好,推荐几款免费的mp3格式转换器
  15. SolidWorks用鼠标中键控制模型的旋转、缩放和平移
  16. 如何用三角形拼成一个正方形
  17. oracle分区表备份恢复
  18. .xz是什么文件怎么解压_如何解压缩 tar.xz 文件
  19. Operand of null-aware operation ‘!‘ has type ‘SchedulerBinding‘ which excludes null.
  20. 2021年硕士研究生入学统一考试408计算机学科考试大纲

热门文章

  1. javascript基础知识-数组
  2. sqlserver2005查询表字典
  3. PHP内置函数parse_str会自动进行urldecode(URL解码)
  4. (原创)EDK中常用文件
  5. 64位Windows7环境下,Eclipse集成svn后出现Failed to load JavaHL Library的解决办法
  6. 7个开源的TTS(文本转语音)系统
  7. SpringBoot常用注解之@Retryable
  8. vscode在vue页面中书写代码没有提示!怎么破?
  9. Kafka开发--C#生产和消费消息
  10. 创建区块计算次数_以太坊创建者Vitalik Buterin为飙升的ETH交易费用提供扩展解决方案...