BZOJ 2654 tree(二分答案+并查集)

【题目链接】 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;
}
时间: 2024-10-09 03:10:53

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

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

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1196 [题目大意] 对于每条可能维修的公路可选择修一级公路或者二级公路,价值不同 要求图连通,且至少有k条一级公路时最大价值公路价值最小. [题解] 二分答案,从一级公路开始处理,利用并查集验证两个条件. [代码] #include <cstdio> #include <algorithm> using namespace std; const int N=20005;

BZOJ 1196 二分答案+并查集

http://www.lydsy.com/JudgeOnline/problem.php?id=1196 题目大意:n个城市,m-1条路,每条路有一级公路和二级公路之分,你要造n-1条路,一级公路至少要造k条,求出所造路的最大所需的val的最小值. 思路:首先我们一定要明确这个不是一题求所有花费的最小值的问题.然后我们只要二分答案就可以了.最后注意一下条件的拜访即可. //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.

HDU3081Marriage Match II(二分答案+并查集+最大流SAP)经典

Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2507    Accepted Submission(s): 856 Problem Description Presumably, you all have known the question of stable marriage match. A

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

链接: https://vjudge.net/problem/HDU-3081 题意: Presumably, you all have known the question of stable marriage match. A girl will choose a boy; it is similar as the game of playing house we used to play when we are kids. What a happy time as so many frie

BZOJ 2654: tree( 二分 + MST )

我们给白色的边增加权值 , 则选到的白色边就会变多 , 因此可以二分一下. 不过这道题有点小坑... ------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i

BZOJ 2654 tree 二分+最小生成树

题目大意 给出一些边,每个边有一个边权和颜色.现在要求出最小边权有need个白边的生成树.输出这个边权. 思路 在白边上加一个权值,这样就可以人为的改变白边出现在最小生成树.这个东西显然可以二分.之后取一下最小值就可以了. CODE #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #def

【bzoj3007】拯救小云公主 二分+对偶图+并查集

题目描述 英雄又即将踏上拯救公主的道路…… 这次的拯救目标是——爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1的时候,他明白这就是一个不可能完成的任务. 但他不死心,他在想,能不能避开boss去拯救公主呢,嘻嘻. Boss的洞穴可以看成一个矩形,英雄在左下角(1,1),公主在右上角(row,line).英雄为了避开boss,当然是离boss距离越远越好了,所以英雄决定找一条路径使到距离boss的最短距离

BZOJ 3562: [SHOI2014]神奇化合物 并查集+dfs

点击打开链接 注意到20w条边,但是询问只有1w,所以有很多边是从头到尾不变的. 首先离线处理,将从未删除的边缩点,缩点后的图的点数不会超过2w,对于每一次add或者delete,直接dfs看是否能从a走到b,然后维护一个ans. 数据不强,不然这种复杂度起码要跑10s.. #include<stdio.h> #include<iostream> #include<algorithm> #include<cstring> using namespace st

bzoj 2733 永无乡 - 并查集 - 线段树

永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛.如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的.现在有两种操作:B x y 表示在岛 x 与岛 y 之间修建一座新桥.Q x k 表示询问当前与岛 x连通的所有岛中第 k 重要的是哪座岛,即所有与岛 x 连通的岛中重要度排名第 k 小的岛是哪 座,请你输