第一句话:算出3.363636的孩子啊,你跑错流种了。

貌似上一篇我讲SDOI出原题?嘿还真是!

半个月前有一个叫WG的男人给我们搞过一场考试... ...

里面有一道题叫做保密... ...SDOI2011... ...

对于每个点求ΣS/ΣT最值然后转跑浮点数网络流... ...

是不是感觉我在讲这道题的正解... ...没错正解就是这样... ...所以我说是原题吧。

跟 保密 是一样的思路。求Σa/Σb的最值,可以用二分答案来做。

Σa/Σb的最大值怎么求呢?设一个当前答案ans;

显然如果有方案使Σa/Σb>ans则答案更优。

把式子化一下得:

Σa>Σb*ans;

Σa-Σb*ans>0;

Σ(a-b*ans)>0;

每次重新建图或者带着二分的mid跑最大费用最大流即可。

没错跑出3.363636是跑的最小费用最大流... ...别问我怎么知道的。

用KM算法算最大权匹配跑的更快奈何我不会。好在它是一个左右相等的完全二分图,用费用流做也是可以的。

出题人良心发现没有卡费用流真是资磁。

还有就是浮点数二分答案跟整数不一样,要用eps。

有哪位大佬能够告诉我 为什么我的费用流 跑的那么慢吗?

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <cstring>
#define LL long long
#define dob double
using namespace std; const int N = 110;
const int M = 100010;
const dob eps = 1e-7;
const dob dobInf = 19260817.2333;
struct Node{int to,C;double val;int next;}E[M];
int head[M],tot,n,S,T,up[M],In[M];
dob a[N][N],b[N][N],far[M],Ans; int gi()
{
int x=0,res=1;char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-')res=-res;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
return x*res;
} inline void link(int u,int v,int c,double val)
{
E[++tot]=(Node){v,c,val,head[u]};
head[u]=tot;
E[++tot]=(Node){u,0,-val,head[v]};
head[v]=tot;
} inline void slink(double Eps)
{
memset(head,0,sizeof(head));tot=1;
for(int i=1;i<=n;++i)
{
link(S,i,1,0.0000000);
link(i+n,T,1,0.0000000);
for(int j=1;j<=n;++j)
link(i,n+j,1,(a[i][j])-Eps*b[i][j]);
}
} inline bool spfa()
{
for(int i=0;i<=T;++i)
far[i]=-dobInf;
memset(up,0,sizeof(up));
queue<int>Q;Q.push(S);
far[S]=0.000000;In[S]=1;
while(!Q.empty())
{
int x=Q.front();Q.pop();
for(int e=head[x];e;e=E[e].next)
if(E[e].C && far[x]+E[e].val>far[E[e].to])
{
up[E[e].to]=e;
far[E[e].to]=far[x]+E[e].val;
if(!In[E[e].to])
Q.push(E[e].to),In[E[e].to]=1;
}
In[x]=0;
}
if(!up[T])return false;
for(int i=T;i^S;i=E[up[i]^1].to)
E[up[i]].C--,E[up[i]^1].C++;
Ans-=far[T];return true;
} inline bool check()
{
Ans=0.00;
while(spfa())
if(Ans>=0.00)return true;
return Ans>=0.00;
} int main()
{
n=gi();S=2*n+1,T=2*n+2;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%lf",&a[i][j]);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%lf",&b[i][j]);
dob l=0.0,r=10000,ans=r;
while(r-l>eps)
{
double mid=(l+r)/2.0;
slink(mid);
if(check())r=mid,ans=mid;
else l=mid;
}
printf("%.6lf\n",ans);
return 0;
}

  

BZOJ 4819 新生舞会的更多相关文章

  1. 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)

    4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 601  Solved: 313 Description 学校 ...

  2. bzoj 4819: [Sdoi2017]新生舞会

    Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间 ...

  3. [BZOJ 4819] [SDOI 2017] 新生舞会

    Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴. 有 \(n\) 个男生和 \(n\) 个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴. C ...

  4. 4819: [Sdoi2017]新生舞会(分数规划)

    4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1031  Solved: 530[Submit][Statu ...

  5. BZOJ4819 新生舞会

    4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MB Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学 ...

  6. 【BZOJ4819】新生舞会(分数规划,网络流)

    [BZOJ4819]新生舞会(分数规划,网络流) 题面 BZOJ Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买 ...

  7. [BZOJ4819][SDOI2017]新生舞会(分数规划+费用流,KM)

    4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1097  Solved: 566[Submit][Statu ...

  8. bzoj4819 [Sdoi2017]新生舞会

    Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的 ...

  9. [Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]

    [Sdoi2017]新生舞会 题意:沙茶01分数规划 貌似\(*10^7\)变成整数更科学 #include <iostream> #include <cstdio> #inc ...

随机推荐

  1. Unity灯光烘焙

    Unity3D烘焙技术 一.Light灯光场景烘焙1.理论理解:(1)烘焙背景:在一个场景中,由于灯光组件起到实时渲染的效果,并直接与计算机硬件GPU渲染器进行交互作用,因此对计算机显卡性能不良,以至 ...

  2. c语言贪吃蛇详解-2.画出蛇

    c语言贪吃蛇详解-2.画出蛇 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 蛇的身 ...

  3. Android 异步消息处理机制前篇(二):深入理解Message消息池

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 上一篇中共同探讨了ThreadLocal,这篇我们一起看下常提到的Message消息池到底是怎么回事,废话少说吧,进入正题. 对于稍有经验的开发人员 ...

  4. 批量去BOM头 遍历目录及子文件,文件夹 PHP源码

    任意php文件,把最后一行替换成自己的目录 即可 <?php class KillBom {     public static $m_Ext = ['txt', 'php', 'js', 'c ...

  5. C#的数据类型总结(2):decimal ,double,float的区别

    1> 三者是精度不同的浮点数,如下图 参见:https://docs.microsoft.com/zh-cn/dotnet/articles/csharp/language-reference/ ...

  6. 关于C++编译链接和模板函数

    一,关于编译链接编译指的的把编译单元生成目标文件的过程链接是把目标文件链接到一起的过程编译单元:可以认为是一个.c或者.cpp文件.每个编译单元经过预处理会得到一个临时的编译单元.预处理会间接包含其他 ...

  7. snprintf 返回值陷阱 重新封装

    snprintf()函数用于将格式化的数据写入字符串,其原型为: int snprintf(char *str, int n, char * format [, argument, ...]); st ...

  8. windows10版本1709 在桌面和文件中点击右键,会引起卡顿

    windows自动升级到1709版本后出现的问题,而之前是没有这种问题的. 最终解决办法:(需要设置注册表) 运行:快捷键Win+R regedit 路径:可直接复制后粘贴+回车 HKEY_CLASS ...

  9. 鼠标悬停,图片放大 CSS实现

    因为最近做的项目刚好用到了这个实现,分享出来   class=enlarge 为div标签的class div img 为标签 .enlarge div img:hover{ transform: s ...

  10. Python爬虫(十九)_动态HTML介绍

    JavaScript JavaScript是网络上最常用也是支持者对多的客户端脚本语言.它可以收集用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页游戏. 我们可以在网页源 ...