【题目链接】 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;
}

BZOJ 2654 tree(二分答案+并查集)的更多相关文章

  1. [HNOI2006]公路修建问题 (二分答案,并查集)

    题目链接 Solution 二分答案+并查集. 由于考虑到是要求花费的最小值,直接考虑到二分. 然后对于每一个二分出来的答案,模拟 \(Kruskal\) 的过程再做一遍连边. 同时用并查集维护联通块 ...

  2. BZOJ 1196 [HNOI2006]公路修建问题(二分答案+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1196 [题目大意] 对于每条可能维修的公路可选择修一级公路或者二级公路,价值不同 要求 ...

  3. BZOJ 1196 二分答案+并查集

    http://www.lydsy.com/JudgeOnline/problem.php?id=1196 题目大意:n个城市,m-1条路,每条路有一级公路和二级公路之分,你要造n-1条路,一级公路至少 ...

  4. [NOI2014] 魔法森林 (二分答案,并查集)

    本思路仅供参考,数据强一点应该该会被卡. 本蒟蒻没有打 \(link\) - \(cut\) - \(tree\) . 而是用暴力水了过去. 具体思路很简单,先二分最少的 \(a_i\) , 再在 \ ...

  5. 洛谷P1991无线通讯网[kruskal | 二分答案 并查集]

    题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...

  6. HDU-3081-Marriage Match 2(最大流, 二分答案, 并查集)

    链接: https://vjudge.net/problem/HDU-3081 题意: Presumably, you all have known the question of stable ma ...

  7. BZOJ 2654: tree( 二分 + MST )

    我们给白色的边增加权值 , 则选到的白色边就会变多 , 因此可以二分一下. 不过这道题有点小坑... ------------------------------------------------- ...

  8. 【BZOJ1594】[Usaco2008 Jan]猜数游戏 二分答案+并查集

    [BZOJ1594][Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在 ...

  9. poj-3657 Haybale Guessing(二分答案+并查集)

    http://poj.org/problem?id=3657 下方有中文版,不想看英文的可直接点这里看中文版题目 Description The cows, who always have an in ...

  10. HNOI2006-公路修建问题(二分答案+并查集)

    公路修建问题 OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织成立了,旨 ...

随机推荐

  1. python学习笔记(五)数值类型和类型转换

    Python中的数值类型有: 整型,如2,520 浮点型,如3.14159,1.5e10 布尔类型 True和False e记法: e记法即对应数学中的科学记数法 >>> 1.5e1 ...

  2. 深入理解 JavaScript(四)

    前言 Bob 大叔提出并发扬了 S.O.L.I.D 五大原则,用来更好地进行面向对象编程,五大原则分别是: The Single Responsibility Principle(单一职责 SRP) ...

  3. hdu 1081 To The Max(dp+化二维为一维)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081 To The Max Time Limit: 2000/1000 MS (Java/Others ...

  4. DesignPattern

    目录

  5. 用python玩微信(聊天机器人,好友信息统计)

    1.用 Python 实现微信好友性别及位置信息统计 这里使用的python3+wxpy库+Anaconda(Spyder)开发.如果你想对wxpy有更深的了解请查看:wxpy: 用 Python 玩 ...

  6. vue基本介绍

    https://cn.vuejs.org/v2/guide/ Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上 ...

  7. CentOS安装按进程实时统计流量情况工具NetHogs笔记

    CentOS安装按进程实时统计流量情况工具NetHogs笔记 一.概述 NetHogs是一款开源.免费的,终端下的网络流量监控工具,它可监控Linux的进程或应用程序的网络流量.NetHogs只能实时 ...

  8. Volatile arrays in Java

    Volatile arrays in Java A slight complication of Java volatile fields, and one sometimes overlooked, ...

  9. tomcat - gc日志输出

    原创 2017年01月04日 14:32:37 2090 tomcat/bin catalina.sh JAVA_OPTS='-server -Xms4g -Xmx4g -Xss256k -XX:Pe ...

  10. LeetCode解题报告—— Jump Game & Merge Intervals & Permutation Sequence

    1. Jump Game Given an array of non-negative integers, you are initially positioned at the first inde ...