BZOJ

最大密度子图。

二分答案\(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(分数规划 最大权闭合子图)的更多相关文章

  1. 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<j​pi,j​​ ...

  2. bzoj 1312: Hard Life 01分数规划+网络流

    题目: Description 在一家公司中,人事部经理与业务部经理不和.一次,总经理要求人事部从公司的职员中挑选出一些来帮助业务部经理完成一项任务.人事部经理发现,在公司的所有职员中,有一些人相处得 ...

  3. bzoj 3232 01分数规划+最大权封闭子图判定

    我们的目标是使v/c最小化,所以构造函数g(x)=v-x*c,那么 二分一个X,判断当时的v-x*c的值是多少,然后根据g(x)函数的 单调递减性来二分,判断,直到g(x)=0的时候当前的X就是答案. ...

  4. [BZOJ 1497][NOI 2006]最大获利(最大权闭合子图)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1497 分析: 这是在有向图中的问题,且边依赖于点,有向图中存在点.边之间的依赖关系可以 ...

  5. BZOJ.1497.[NOI2006]最大获利(最小割 最大权闭合子图Dinic)

    题目链接 //裸最大权闭合子图... #include<cstdio> #include<cctype> #include<algorithm> #define g ...

  6. bzoj 1565 [NOI2009]植物大战僵尸【tarjan+最大权闭合子图】

    一上来以为是裸的最大权闭合子图,上来就dinic -然后没过样例.不得不说样例还是非常良心的给了一个强连通分量,要不然就WA的生活不能自理了 然后注意到有一种特殊情况:每个植物向他保护的植物连边(包括 ...

  7. bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上... 今天再认真看看,找出 ...

  8. LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配

    #2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  9. [SCOI2018]游泳池(计算几何+分数规划+最大权闭合子图)

    题目链接 https://www.luogu.org/problemnew/show/U56187 注:题面参考了网上的其他博客,并非原题题面,因此数据范围可能有误.数据为原创数据. 题解 其实就是许 ...

随机推荐

  1. Software tips

    1.Microsoft office professional plus 2013秘钥 PD3W7-NVGG7-YKGQX-7CRDG-J2MG7(test success)MTGRC-8BM6H-W ...

  2. 使用7zip批量压缩文件夹到不同压缩包

    for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a "%%X.7z" "%%X\" ...

  3. Python3 zip() 函数

    描述 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存. 我们可以使用 list() 转换来输出列表. 如果 ...

  4. Django认证系统auth认证

    使用Django认证系统auth认证 auth认证系统可以处理范围非常广泛的任务,且具有一套细致的密码和权限实现.对于需要与默认配置不同需求的项目,Django支持扩展和自定义认证;会将用户信息写入到 ...

  5. vi/vim键盘对应图

    来源:http://www.runoob.com/linux/linux-vim.html

  6. springboot调用http方式

    1.httpclient 2.okhttp 3.feign 安装Gradle包 compile 'org.springframework.cloud:spring-cloud-starter-open ...

  7. [转] zepto的各种坑

    1.编译zepto.模块之前可能有依赖关系,整体顺序参考下面这个即可: MODULES="zepto event ajax form ie detect fx fx_methods asse ...

  8. PyTorch中的backward [转]

    转自:https://sherlockliao.github.io/2017/07/10/backward/ backward只能被应用在一个标量上,也就是一个一维tensor,或者传入跟变量相关的梯 ...

  9. python多线程之t.setDaemon(True) 和 t.join()

    0.目录 1.参考2.结论    (1)通过 t.setDaemon(True) 将子线程设置为守护进程(默认False),主线程代码执行完毕后,python程序退出,无需理会守护子线程的状态.    ...

  10. 学习之"setjmp和longjmp函数"

    Linux学习之"setjmp和longjmp函数"   转贴,原文地址:http://www.cnblogs.com/lq0729/archive/2011/10/23/2222 ...