题目描述

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

题目保证有解。

输入输出格式

输入格式

第一行\(V,E,need\)分别表示点数,边数和需要的白色边数。

接下来\(E\)行

每行\(s,t,c,col\)表示这边的端点(点从\(0\)开始标号),边权,颜色(\(0\)白色\(1\)黑色)。

输出格式

一行表示所求生成树的边权和。

输入输出样例

输入样例#1

2 2 1
0 1 1 1
0 1 2 0

输出样例#1

2

说明

\(0:V<=10\)

\(1,2,3:V<=15\)

\(0,..,19:V<=50000,E<=100000\)

所有数据边权为\([1,100]\)中的正整数。

\(By\) \(WJMZBMR\)

题解

\(WQS\)二分入门题。

关于\(WQS\)二分,可以把这里作为教程,做一下这里的练习题。

回到这个题,我们可以将\(WQS\)二分和\(MST\)(最小生成树)配合解题。

考虑给每一条白边减去一个值\(cost\),使得在坐标轴上横坐标为\(k\)的点纵坐标最大。

二分\(cost\),将每一条白边减去\(cost\),最后用\(Kruskal\)跑一遍\(MST\)即可。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype> using namespace std; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar();}
return f * x;
} int n, m, k, sum, tot, cnt, ans;
int uu[100003], vv[100003], ww[100003], cc[100003], fa[100003];
struct Node
{
int u, v, w, c;
} e[100003]; inline bool cmp(Node x, Node y)//将点权排序
{
if (x.w == y.w) return x.c > y.c;
else return x.w < y.w;
} int getf(int u)//并查集找祖先
{
if (fa[u] == u) return u;
return fa[u] = getf(fa[u]);
} inline bool check(int t)//二分的check
{
tot = cnt = 0;//将计数器清零
for (int i = 1; i <= n; i++) fa[i] = i;//初始化祖先
for (int i = 1; i <= m; i++)//存图
{
e[i].u = uu[i], e[i].v = vv[i], e[i].c = cc[i], e[i].w = ww[i];
if (!cc[i]) e[i].w = e[i].w - t;//白边减去边权
}
sort(e + 1, e + 1 + m, cmp);//将边排序
for (int i = 1; i <= m; i++)//跑一遍MST
{
int p = getf(e[i].u), q = getf(e[i].v);
if (p != q)
{
fa[p] = q, tot = tot + e[i].w;
if (!e[i].c) ++cnt;//是白色边就计数器+1
}
}
return cnt <= k;//符合题目条件
} int main()
{
n = gi(), m = gi(), k = gi();
for (int i = 1; i <= m; i++)
{
uu[i] = gi(), vv[i] = gi(), ww[i] = gi(), cc[i] = gi();
++uu[i], ++vv[i];
}//输入
int Left = -105, Right = 105;
while (Left <= Right)//开始二分
{
int mid = (Left + Right) >> 1;
if (check(mid))
{
Left = mid + 1, ans = tot + k * mid;//注意ans的存储
}
else
{
Right = mid - 1;
}
}
printf("%d\n", ans);//输出ans
return 0;//结束
}

题解【洛谷P2619】[国家集训队2]Tree I的更多相关文章

  1. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

  2. 洛谷.2619.[国家集训队2]Tree I(带权二分 Kruskal)

    题目链接 \(Description\) 给定一个无向带权连通图,每条边是黑色或白色.求一棵最小权的恰好有K条白边的生成树. \(Solution\) Kruskal是选取最小的n-1条边.而白边数有 ...

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

    题目链接 luogu P2619 [国家集训队2]Tree I 题解 普通思路就不说了二分增量,生成树check 说一下坑点 二分时,若黑白边权有相同,因为权值相同优先选白边,若在最有增量时出现黑白等 ...

  4. P2619 [国家集训队2]Tree I(最小生成树+二分)

    P2619 [国家集训队2]Tree I 每次二分一个$x$,每条白边加上$x$,跑最小生成树 统计一下满足条件的最小值就好了. to me:注意二分不要写挂 #include<iostream ...

  5. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  6. 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)

    洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...

  7. 洛谷 P1501 [国家集训队]Tree II 解题报告

    P1501 [国家集训队]Tree II 题目描述 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\( ...

  8. 洛谷P1501 [国家集训队]Tree II(LCT,Splay)

    洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...

  9. 洛谷P2172 [国家集训队]部落战争 题解

    题目链接:https://www.luogu.org/problemnew/show/P2172 分析: 不要被[国家集训队]的标签吓到,其实这题不是很难. 本题可以对比P4304 [TJOI2013 ...

  10. [洛谷P1527] [国家集训队]矩阵乘法

    洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...

随机推荐

  1. [Agc005D/At2060] Minimum Sum - 单调栈

    鉴于早上那题让我怀疑单调栈白学,特意来复习下单调栈 题意 考虑按照每个元素对答案的贡献来统计,那么我们只需要找到每个元素左边右边第一个比它小的就可 这题给的又是排列,简直不能再良心 #include ...

  2. Selenium3+python自动化007-等待时间

    import time 一.强制等待 sleep(秒) 二.显示等待 使WebDriver等待指定元素条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException) 1. 导 ...

  3. NOI2005 维护数列 lg2042

    这道题据说是noi题目中算是比较毒瘤的数据结构题了,5k多的代码加上随手写挂细节,我调了两天 题面见https://www.luogu.org/problemnew/show/P2042 (歪个题,这 ...

  4. Maven无法下载com.oracle:ojdbc14:jar解决方法

    问题说明:导入Maven项目时,想要添加Oracle驱动包时,Maven的pom.xml总是报Missing artifact com.oracle:ojdbc14:jar:10.2.0.1.0错. ...

  5. 登录时 按Enter 进入登录界面 或者下一行

    function keyLogin() { if (event.keyCode == 13) //回车键的键值为13 $(".btn-submit").click(); //调用登 ...

  6. Qt VS Tools插件官方下载及安装

    下载 官方下载地址:https://download.qt.io/development_releases/vsaddin/(国外网站直接打开超级慢) 找到对应的VS版本下载 安装 下载完成后安装,打 ...

  7. 模块二、shell脚本逻辑结构

    七.if结构条件句知识与实践 (一)if条件句单双分支语法 1.单分支 if 条件 then 指令 fi 2.双分支 if 条件 then 指令 else 指令集2 fi (二)if条件句多分支语句 ...

  8. R Tidyverse dplyr包学习笔记2

    Tidyverse 学习笔记 1.gapminder 我理解的gapminder应该是一个内置的数据集 加载之后使用 > # Load the gapminder package > li ...

  9. EF中的实体关系

    导航属性的理解: 指数据库的表所对应的实体类,除了要有每个字段所对应的属性之外,还应该有一个与之有关联的表的属性,一对一的关系就是关联表的类型,一对多的关系就是关联表的类型的ICollection的泛 ...

  10. Wooden Sticks(贪心)

    Wooden Sticks. win the wooden spoon:成为末名. 题目地址:http://poj.org/problem?id=1065 There is a pile of n w ...