题解【洛谷P2619】[国家集训队2]Tree I
题目描述
给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有\(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的更多相关文章
- 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)
洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...
- 洛谷.2619.[国家集训队2]Tree I(带权二分 Kruskal)
题目链接 \(Description\) 给定一个无向带权连通图,每条边是黑色或白色.求一棵最小权的恰好有K条白边的生成树. \(Solution\) Kruskal是选取最小的n-1条边.而白边数有 ...
- luogu P2619 [国家集训队2]Tree I
题目链接 luogu P2619 [国家集训队2]Tree I 题解 普通思路就不说了二分增量,生成树check 说一下坑点 二分时,若黑白边权有相同,因为权值相同优先选白边,若在最有增量时出现黑白等 ...
- P2619 [国家集训队2]Tree I(最小生成树+二分)
P2619 [国家集训队2]Tree I 每次二分一个$x$,每条白边加上$x$,跑最小生成树 统计一下满足条件的最小值就好了. to me:注意二分不要写挂 #include<iostream ...
- Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...
- 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)
洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...
- 洛谷 P1501 [国家集训队]Tree II 解题报告
P1501 [国家集训队]Tree II 题目描述 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\( ...
- 洛谷P1501 [国家集训队]Tree II(LCT,Splay)
洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...
- 洛谷P2172 [国家集训队]部落战争 题解
题目链接:https://www.luogu.org/problemnew/show/P2172 分析: 不要被[国家集训队]的标签吓到,其实这题不是很难. 本题可以对比P4304 [TJOI2013 ...
- [洛谷P1527] [国家集训队]矩阵乘法
洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...
随机推荐
- #助力CSP2019# OI中容易出现的**错误汇总
多测不清空,爆0两行泪 3年OI一场空,不开long long见祖宗 线段树空间需要开4倍 读入有负数的时候,如果要写快读,要识别负号 持续更新
- 斜率优化 DP
CF311B Cats Transport 暑假到现在终于过了这道题
- many connection errors,更改max_connection_errors的值
https://www.cnblogs.com/tonyccc/p/11496101.html https://blog.csdn.net/li_li_lin/article/details/7276 ...
- MyEclipse启动Tomcat报错:Could not find the main class: org.apache.catalina.startup
问题描述 Could not find the main class:org.apache.catalina.startup.Bootstrap. Program will exit 问题原因 主要原 ...
- Python读取Excel,日期列读出来是数字的处理
Python读取Excel,里面如果是日期,直接读出来是float类型,无法直接使用. 通过判断读取表格的数据类型ctype,进一步处理. 返回的单元格内容的类型有5种: ctype: 0 empty ...
- Python自定义任务发邮件提醒
前言 在工作中,有时会有一些定期需要执行的任务或在将来某一天需要执行的任务,为避免疏漏,设计个小工具,发邮件提醒自己去处理. 方案简介 1.建立一个Excel文件,里面定义好待提醒的任务 2.建立一个 ...
- SpringBoot学习- 2、使用IDEA创建项目
SpringBoot学习足迹 上一节使用sts创建项目,感觉只是基于eclipse做了一些界面定制,还是改使用IDEA开发,为了跟上时代,将使用IDEA最新版本,安装各种最新插件. 1.下载IDEA ...
- promise的连缀写法
promise的连缀写法 以上写法相当于写了两个实例 promise.all() 1. promise.all() all这个方法是 promise 构造函数的成员不是实例对象成员,这个方法接受一个参 ...
- 06 部署redis缓存数据库
1 安装redis $ sudo apt-get install redis-server 安装完成后,Redis服务器会自动启动,检查Redis服务器程序 注:在安装过程中,腾讯服务器会中途停止. ...
- BUUCTF [SUCTF 2019]EasySQL
首先打开网址 发现有三种显示方法 还有一个没有输出 可以堆叠注入 1;show databases; 1;show tables; 可以看到有一个Flag表 测试发现from flag都被过滤不能直接 ...