题目链接

luogu P2619 [国家集训队2]Tree I

题解

普通思路就不说了二分增量,生成树check

说一下坑点

二分时,若黑白边权有相同,因为权值相同优先选白边,若在最有增量时出现黑白等权边则更新出 > 和 = 最小值等价,那么不会更新到 = 情况,

因为等价,那么处理时只需看做把等价的黑白两边交换即可

需要每次直接减去 增量 * need 的价值

代码

#include<cstdio>
#include<algorithm>
const int maxn = 100007; int E,V,need;
struct node {
int u,v,w,col;
bool operator < (const node & a) const {
if(a.w == w) return col < a.col;
else return w < a.w;
}
}edge[maxn],e[maxn];
int ans = 0;
int fa[maxn];
int find(int x) {
if(fa[x] != x) fa[x] = find(fa[x]);
return fa[x];
}
bool check(int x) {
int tmp = 0;
for(int i = 1;i <= V;++ i) {
e[i] = edge[i];
if(e[i].col == 0) e[i].w = edge[i].w + x;
}
for(int i = 0;i <= E + 1;++ i) fa[i] = i;
std::sort(e + 1,e + V + 1);int bs = 0;
for(int num = 0,i = 1;i <= V;++ i) {
int X = e[i].u,y = e[i].v;
int fx = find(X),fy = find(y);
if(fx != fy) {
tmp += e[i].w;
num ++;
fa[fx] = fy;
if(e[i].col == 0) bs ++;
}
if(num == E - 1) break;
}
if(bs >= need) {
ans = tmp - (x * need);
return true;
}
return false;
}
int main() {
scanf("%d%d%d",&E,&V,&need);
for(int i = 1;i <= V;++ i) {
scanf("%d%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w,&edge[i].col);
}
int l = -107,r = 107;
while(l <= r) {
int mid = (l + r) >> 1;
if(check(mid)) l = mid + 1;
else r = mid - 1;
}
printf("%d\n",ans);
return 0;
}

最新文章

  1. VTK初学一,比较常见的错误1
  2. CentOS7 续
  3. java基础之:匿名内部类
  4. SQL技术内幕-5 比较特殊 insert into 数据的写法
  5. Java学习之国际化程序
  6. docker log 文件 清理
  7. BZOJ-1192-[HNOI2006]鬼谷子的钱袋
  8. create react app 项目部署在Spring(Tomcat)项目中
  9. 【电子书分享】Learning PySpark下载,包含pdf、epub格式
  10. Tensorflow实战系列之二:
  11. telnet客户端程序
  12. Eclipse 工作空间的相关说明
  13. JavaScript之命名空间模式
  14. [Git/GitHub] Tutorial 1. Git download and commit first project
  15. Unit Testing of Spring MVC Controllers: “Normal” Controllers
  16. ubuntu下nodejs开发环境搭建
  17. python group()--转载
  18. AT994 【11の倍数】
  19. Linux内核同步 - Per-CPU变量
  20. JavaWeb之JSP入门

热门文章

  1. [oracle]centos 7 安装oracle
  2. js父页面和子页面相互取值
  3. 数组C - 玛雅日历
  4. 【转】CentOS7 yum方式配置LAMP环境
  5. win10环境变量
  6. LCD之mipi DSI接口驱动调试流程【转】
  7. 细说show slave status参数详解(最全)【转】
  8. 在Nginx服务器上屏蔽IP
  9. HDU 6205 2017沈阳网络赛 思维题
  10. Redis 常见面试题