题目描述

给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有\(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. 记录 Docker 的学习过程 (数据挂载)

    docker 存储篇 容器中的存储是分层的, 在容器中,如果我们要创建一个文件,会在文件的最上层(可写层)创建 容器中内置的文件,默认来讲是只读的,只有自己创建的文件才是可写状态 比如说 /etc/p ...

  2. ReviewBoard使用:添加SVN

    1.登录ReviewBoard,选择“Admin” 2.选择 “Repositores”,点击按钮“Add” 3.填写内容,然后点击按钮“SAVE”保存 Name:仓库名称(自己随意写) Hostin ...

  3. spring中实现基于注解实现动态的接口限流防刷

    本文将介绍在spring项目中自定义注解,借助redis实现接口的限流 自定义注解类 import java.lang.annotation.ElementType; import java.lang ...

  4. PyQt5-QDateEdit的简单使用

    使用PyQt5开发图形界面,里面使用日期框,这里把这个QDateEdit组件命名为:beginDate from PyQt5.QtCore import QDate 1.初始化赋值,不设置则默认为20 ...

  5. webpack 之搭建本地服务器

    搭建本地服务器 webpack提供了一个可选的本地开发服务器,这个本地服务器基于node.js搭建,内部使用express框架,可以实现 我们想要的让浏览器自动刷新显示我们修改后的结果 不过它是一个单 ...

  6. 介绍axios和promise

    今天小编为大家带来 axios 和promise的详细讲解,包含 axios的使用方法 多种写法,封装 以及 promise的详细讲解,项目中如何运用等,会一一的为大家讲解清楚. 一.axios的介绍 ...

  7. svg 放大缩小后的比例

    function getCoords(evt) { // 计算出当前屏幕与svg的比例    var canvas = document.getElementById("canvase&qu ...

  8. 谷歌浏览器安装jsonview

    1.下载JsonView扩展程序压缩包 下载链接:https://pan.baidu.com/s/1B0IkrHHyTiYtwJEGE_halA 提取码:myi6 2.解压这个压缩包 3.打开谷歌浏览 ...

  9. zabbix4.2配置监控华为路由器:基于ENSP模拟器

    一.基于ENSP模拟器的华为路由器 这里是华为模拟器中的设备,并不是真机,所以要先保证华为模拟器中的网络设备可以和物理主机.虚拟机能通信,这是前提.如何保证通信请看之前的文章:https://www. ...

  10. H5Plus 入门学习-Dcloud H5+ API调用实例

    使用API Reference完整简单的操作,更多操作查看官方文档. 最后提供项目的下载地址[下载][一款移动APP演示]