BZOJ.1312.[Neerc2006]Hard Life(分数规划 最大权闭合子图)
最大密度子图。
二分答案\(x\),转为求是否存在方案满足:\(边数-x*点数\geq 0\)。
选一条边就必须选两个点,所以可以转成最大权闭合子图。边有\(1\)的正权,点有\(x\)的负权。判断\(边数-最小割\)是否非负即可。
有一个结论是,任意两个密度子图,它们的密度差不超过\(\frac{1}{n^2}\)。
所以拿eps=1e-7或者更小做二分边界不对。。。
必须是\(while(l+1.0/n/n<=r)\)。
还要注意精度的问题。。
m=0要输出1。
//1300kb 236ms
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define eps 1e-8
const int N=2005,M=6005+205;
const double INF=1ll<<55;
int n,m,src,des,Ans,A[N],B[N],Enum,H[N],nxt[M],fr[M],to[M],lev[N],pre[N];
double cap[M];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline void AE(int u,int v,double w)
{
to[++Enum]=v, fr[Enum]=u, nxt[Enum]=H[u], H[u]=Enum, cap[Enum]=w;
to[++Enum]=u, fr[Enum]=v, nxt[Enum]=H[v], H[v]=Enum, cap[Enum]=0;
}
bool BFS()
{
static int q[N];
for(int i=0; i<des; ++i) lev[i]=des+1;
int h=0,t=1; q[0]=des, lev[des]=0;
while(h<t)
{
int x=q[h++];
for(int i=H[x]; i; i=nxt[i])
if(cap[i^1]>=eps && lev[to[i]]==des+1)
lev[to[i]]=lev[x]+1, q[t++]=to[i];
}
return lev[src]<=des;
}
inline double Augment()
{
double mn=INF;
for(int i=des; i; i=fr[pre[i]])
mn=std::min(mn,cap[pre[i]]);
for(int i=des; i; i=fr[pre[i]])
cap[pre[i]]-=mn, cap[pre[i]^1]+=mn;
return mn;
}
double ISAP()
{
static int cur[N],num[N];
if(!BFS()) return 0;
for(int i=0; i<=des; ++i) cur[i]=H[i], ++num[lev[i]];
int x=0; double res=0;
while(lev[0]<=des)
{
if(x==des) x=0, res+=Augment();
bool can=0;
for(int i=cur[x]; i; i=nxt[i])
if(lev[to[i]]==lev[x]-1 && cap[i]>=eps)
{
can=1, cur[x]=i, pre[x=to[i]]=i;
break;
}
if(!can)
{
int mn=des;
for(int i=H[x]; i; i=nxt[i])
if(cap[i]>=eps) mn=std::min(mn,lev[to[i]]);
if(!--num[lev[x]]) break;
++num[lev[x]=mn+1], cur[x]=H[x];
if(x) x=fr[pre[x]];
}
}
return res;
}
bool Check(double x)
{
Enum=1, memset(H,0,des+1<<2);
for(int i=1; i<=m; ++i) AE(0,i+n,1), AE(i+n,A[i],INF), AE(i+n,B[i],INF);
for(int i=1; i<=n; ++i) AE(i,des,x);
return m-ISAP()>=eps;
}
void DFS(int x)
{
static bool vis[N];
vis[x]=1, Ans+=(x<=n);
for(int i=H[x]; i; i=nxt[i])
if(cap[i]>=eps && !vis[to[i]]) DFS(to[i]);
}
int main()
{
n=read(),m=read(),src=0,des=n+m+1;
if(!m) return puts("1"),0;
for(int i=1; i<=m; ++i) A[i]=read(),B[i]=read();
double l=0.49,r=m/2.0,mid,EPS=1.0/n/n;//l不能设0.5。虽然最优比率最小是0.5,但是因为神奇的浮点误差0.5做最优比率并不对(0.49999999403953才对)
while(l+EPS<r)
if(Check(mid=(l+r)*0.5)) l=mid;
else r=mid;
Check(l), DFS(src);
printf("%d\n",Ans-1);
return 0;
}
BZOJ.1312.[Neerc2006]Hard Life(分数规划 最大权闭合子图)的更多相关文章
- 2018.11.06 NOIP训练 最大获利(profit)(01分数规划+最大权闭合子图)
传送门 好题啊. ∑i<jpi,jK∗(200−K)>X\frac{\sum_{i<j}p_{i,j}}{K*(200-K)}>XK∗(200−K)∑i<jpi,j ...
- bzoj 1312: Hard Life 01分数规划+网络流
题目: Description 在一家公司中,人事部经理与业务部经理不和.一次,总经理要求人事部从公司的职员中挑选出一些来帮助业务部经理完成一项任务.人事部经理发现,在公司的所有职员中,有一些人相处得 ...
- bzoj 3232 01分数规划+最大权封闭子图判定
我们的目标是使v/c最小化,所以构造函数g(x)=v-x*c,那么 二分一个X,判断当时的v-x*c的值是多少,然后根据g(x)函数的 单调递减性来二分,判断,直到g(x)=0的时候当前的X就是答案. ...
- [BZOJ 1497][NOI 2006]最大获利(最大权闭合子图)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1497 分析: 这是在有向图中的问题,且边依赖于点,有向图中存在点.边之间的依赖关系可以 ...
- BZOJ.1497.[NOI2006]最大获利(最小割 最大权闭合子图Dinic)
题目链接 //裸最大权闭合子图... #include<cstdio> #include<cctype> #include<algorithm> #define g ...
- bzoj 1565 [NOI2009]植物大战僵尸【tarjan+最大权闭合子图】
一上来以为是裸的最大权闭合子图,上来就dinic -然后没过样例.不得不说样例还是非常良心的给了一个强连通分量,要不然就WA的生活不能自理了 然后注意到有一种特殊情况:每个植物向他保护的植物连边(包括 ...
- bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上... 今天再认真看看,找出 ...
- LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配
#2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- [SCOI2018]游泳池(计算几何+分数规划+最大权闭合子图)
题目链接 https://www.luogu.org/problemnew/show/U56187 注:题面参考了网上的其他博客,并非原题题面,因此数据范围可能有误.数据为原创数据. 题解 其实就是许 ...
随机推荐
- WireShark Flow capture analysis
Wiresharkl流量分析 1.图示是对WiFi数据接口的80号端口进行数据捕获,设置混杂模式 过滤表达式设置: IP地址设置过滤 ip.src==191.168.1.102 ip.dst ...
- PyCharm设置字体风格
设置字体风格:File—Setting—Editor-Color Scheme-Color Scheme Font-把Scheme设置为:WarmNeon
- 监控CPU使用率并发送报警邮件
#!/bin/bash DATE=$(date +%F" "%H:%M) #只支持centos6 IP=$(ifconfig eth0 | awk -F '[ :]+' '/ine ...
- add web server(nginx)
#!/bin/bash # # Web Server Install Script # Last Updated 2012.09.24 # ##### modify by WanJie 2012.09 ...
- Java+selenium之WebDriver对浏览器的简单操作(一)
操作浏览器的主要方法都来自 org.openqa.selenium.WebDriver 这个接口 这些方法都是在 org.openqa.selenium.remote.RemoteWebDriver这 ...
- 手机app数据的爬取之mitmproxy安装教程
mitmproxy是一个支持HTTP和HTTPS的抓包程序,类似Fiddler.Charles的功能,只不过它通过控制台的形式操作. 此外,mitmproxy还有两个关联组件,一个是mitmdump, ...
- Git的常见基础操作命令
Git的常见基础操作命令 1安装初始化 1.1安装git本地安装Windows版本 下载地址: https://git-scm.com/downloads/ 1.2初始化Git用户信息配置 配置git ...
- 腾讯应用宝Android 应用加固(乐固)操作说明(转)
此处引用腾讯云对加固的优点说明如下: 为什么应用需要加固? 若应用不做任何安全防护,极易被病毒植入.广告替换.支付渠道篡改.钓鱼.信息劫持等,严重侵害开发者的利益. 应用进行安全防护,防止应用分发后, ...
- JQuery调用WCF服务
一:创建一个wcf服务项目 [ServiceContract] public interface IService1 { [OperationContract] [WebInvoke(RequestF ...
- XML使用与总结
xml是一种比较方便的数据储存方式,它适用于小数据的存储.最常见的适用地方莫过于各种web.config与app.config了. 一.创建一个简单的xml路径 public static str ...