「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 ...
随机推荐
- nfs网络共享服务基础
nfs原理 1.开启RPC服务 2.NFS向RPC服务注册启动的端口 3.用户向RPC询问NFS服务的端口 4.RPC返回端口给客户端 5.客户端通过获得的端口与NFS服务器进行数据传输 实验步骤 一 ...
- 字符串无法分割 split无效: java split()使用“.” “\” "|" "*" "+"要转义
.是特殊字符 特殊字符需要转义. 改成split(“\\.”)
- Binder对象死亡通知机制
本文參考<Android系统源码情景分析>,作者罗升阳. 一.Binder库(libbinder)代码: ~/Android/frameworks/base/libs/bin ...
- MySQL--修改Mac中的默认编码
1.在终端中进入到etc目录下 2.打开etc目录下的my.cnf文件(如果这样修改不了的就要提高用户权限, 可以尝试使用sudo来打开文件) 3.将一下内容添加到my.cnf文件中 [client] ...
- 洛谷P1970 [NOIP2013提高组Day2T2] 花匠
P1970 花匠 题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定 把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希 望剩下的花排 ...
- Codeforces 356A
这题有个注意的地方,就是对集合边读边删除的时候,应该尤为注意.. my_set.erase(it++) #include <iostream> #include <cstring ...
- 【JZOJ3296】【SDOI2013】刺客信条(assassin)
╰( ̄▽ ̄)╭ Description 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一名刺客.最终,凭借着他的努力和出众的天赋 ...
- Python 字符编码处理总结
Python中经常遇到这样那样的字符编码问题,尤其在处理网页源码时(特别是爬虫中): UnicodeDecodeError: 'XXX' codec can't decode bytes in pos ...
- Vue项目根据不同运行环境打包项目
前提 项目是直接通过 vue-cli脚手架 生成的: 假设在项目开发中,分为三个环境 -- · 测试环境· 预生产环境· 生产环境 每个环境的接口地址都是不同的,而 vue-cli 给出的环境只有 d ...
- JSP Web第四章整理复习 JSP技术基础
P104 JSP简介 (1)基本概念:jsp技术.jsp.jsp网页组成 JSP技术基础java servlet和整个java体系的Web服务器端开发技术. JSP表示它是用java写的Web服务页面 ...