「BZOJ2654」tree
「BZOJ2654」tree
最小生成树+二分答案。
最开始并没有觉得可以二分答案,因为答案并不单调啊。
其实根据题意,白边的数目肯定大于need条,而最小生成树的白边数并不等于need(废话),可以二分将每条白边的权值+mid,这样就可以控制最小生成树中白边的条数,
对于一个mid,将所有的白边权值加mid,然后跑kruskal,求出最小生成树中白边的个数num以及此时的权值和ans(要减去mid*need),如果num=need直接输出ans,如果num<need
则让r=mid继续二分,如果num>need,则要记录一下此时的答案(注意此时的答案并不是ans-mid*num,而是ans-mid*need),因为有可能会出现如下情况:要求8条白边,mid=0时num=12,mid=1时num=0,无法是num恰好等于need,此时记录的数据就是答案。
#include<algorithm>
#include<iostream>
#include<cstdio>
#define INF 0x7fffffff
using namespace std;
struct edge
{
int u,v,w,c,nxt;
#define u(x) ed[x].u
#define v(x) ed[x].v
#define w(x) ed[x].w
#define c(x) ed[x].c
#define n(x) ed[x].nxt
friend bool operator < (edge a,edge b)
{return a.w==b.w?(a.c<b.c):(a.w<b.w);}
}ed[100010];
int first[50010],num_e;
#define f(x) first[x]
int f[50010];
int v,e,n,nb;
int l=-500,r=500,mid,ans,eans=INF; int getf(int x){return (f[x]==x)?x:f[x]=getf(f[x]);}
void hb(int x,int y){x=getf(x),y=getf(y),f[y]=x;}
inline void add(int u,int v,int w,int c);
int kruskal()
{
int num=0;ans=0;
for(int i=0;i<=v;i++)f[i]=i;
sort(ed+1,ed+num_e+1);
for(int i=1;i<=num_e;i++)
if(getf(u(i))!=getf(v(i)))
{
ans+=w(i);
hb(u(i),v(i));
if(!c(i))num++;
}
return num;
}
signed main()
{
// freopen("9.in","r",stdin);
// freopen("in.txt","r",stdin); scanf("%d%d%d",&v,&e,&n);
for(int i=0;i<=v;i++)f[i]=i;
int s,t,w,c;
for(int i=1;i<=e;i++)
{
scanf("%d%d%d%d",&s,&t,&w,&c);
add(s,t,w,c);
if(!c)nb++;
}
sort(ed+1,ed+num_e+1);
int num;
while(l<r-1)
{
mid=(l+r)>>1;
for(int i=1;i<=num_e;i++)if(!c(i))w(i)+=mid;
num=kruskal();
if(num==n){printf("%d\n",ans-mid*num);return 0;}
else if(num<n)r=mid;
else {l=mid;eans=ans-mid*n;}
for(int i=1;i<=num_e;i++)if(!c(i))w(i)-=mid;
}
printf("%d\n",eans);
}
inline void add(int u,int v,int w,int c)
{
++num_e;
u(num_e)=u;
v(num_e)=v;
w(num_e)=w;
c(num_e)=c;
n(num_e)=f(u);
f(u)=num_e;
}
「BZOJ2654」tree的更多相关文章
- 「AGC010F」 Tree Game
「AGC010F」 Tree Game 传送门 切了一个 AGC 的题,很有精神. 于是决定纪念一下. 首先如果任意一个人在点 \(u\),他肯定不会向点权大于等于 \(a_u\) 的点走的,因为此时 ...
- 「POJ3237」Tree(树链剖分)
题意 给棵n个点的树.边有边权然后有三种操作 1.CHANGE i v 将编号为i的边权变为v 2.NEGATE a b 将a到b的所有边权变为相反数. 3.QUERY a b 查询a b路径的最大边 ...
- 「CF911F」Tree Destruction
传送门 Luogu 解题思路 显然的贪心策略,因为每次都要尽量使得删点后的收益最大. 我们可以求出树的直径(因为树上的任意一个节点与其距离最远的点一定是直径的端点). 然后我们对于所有不是直径上的点, ...
- LoibreOJ 2042. 「CQOI2016」不同的最小割 最小割树 Gomory-Hu tree
2042. 「CQOI2016」不同的最小割 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- 「SPOJ10707」Count on a tree II
「SPOJ10707」Count on a tree II 传送门 树上莫队板子题. 锻炼基础,没什么好说的. 参考代码: #include <algorithm> #include &l ...
- 「SPOJ1487」Query on a tree III
「SPOJ1487」Query on a tree III 传送门 把树的 \(\text{dfs}\) 序抠出来,子树的节点的编号位于一段连续区间,然后直接上建主席树区间第 \(k\) 大即可. 参 ...
- 「luogu2633」Count on a tree
「luogu2633」Count on a tree 传送门 树上主席树板子. 每个节点的根从其父节点更新得到,查询的时候差分一下就好了. 参考代码: #include <algorithm&g ...
- 「AGC035C」 Skolem XOR Tree
「AGC035C」 Skolem XOR Tree 感觉有那么一点点上道了? 首先对于一个 \(n\),若 \(n\equiv 3 \pmod 4\),我们很快能够构造出一个合法解如 \(n,n-1, ...
- 「数据结构」Link-Cut Tree(LCT)
#1.0 简述 #1.1 动态树问题 维护一个森林,支持删除某条边,加入某条边,并保证加边.删边之后仍然是森林.我们需要维护这个森林的一些信息. 一般的操作有两点连通性,两点路径权值和等等. #1.2 ...
随机推荐
- mysql基础记录
1. 概念介绍 数据库:专门存储数据,存储数据的仓库,同时提供了对数据的操作方法,增删改查的方法 事务 事务:是作为一个单元的一组有序的数据库操作,如果组当中所有操作都成功,则事务执行成功,如果有一个 ...
- 实时查看linux网卡流量 的base脚本
#!/bin/bash " ] do eth=$ RXpre=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{pri ...
- 大半夜吃饱了撑的帮人调IE玩
那高手的也是IE6,我也是IE6,但是他的IE6就总是进recv,我的IE6就进WSARecv,一点都不科学...擦..不调了.
- Leetcode686.Repeated String Match重复叠加字符串匹配
给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1. 举个例子,A = "abcd",B = " ...
- Flask – SQLite:增加成员
目录 简介 结构 展示 技术 运行 代码 创建数据库表单 views视图 models模块 home主页 list列表页 result消息结果页 studentst添加成员 简介 结构 $ tree ...
- HTML input type=file文件选择表单的汇总(二)
1. 原生file input大小.按钮文字等UI自定义 元素input的原生样式,不是太好看: 有一种方法是这样的:让file类型的元素透明度0,覆盖在我们好看的按钮上.然后我们去点击好看的按钮,实 ...
- FatMouse' Trade (贪心)
#include <iostream> #include <stdio.h> #include <cstring> #include <cmath> # ...
- 使用Centos7 安装docker的步骤
1.Linuxyum源切换阿里云软件源 备份本机软件源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.b ...
- Java1.8新特性 - Stream流式算法
一. 流式处理简介 在我接触到java8流式数据处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现.比如我们希望对一个包 ...
- cnn.py cs231n
n import numpy as np from cs231n.layers import * from cs231n.fast_layers import * from cs231n.layer_ ...