BZOJ 4819 新生舞会
第一句话:算出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 新生舞会的更多相关文章
- 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 601 Solved: 313 Description 学校 ...
- bzoj 4819: [Sdoi2017]新生舞会
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间 ...
- [BZOJ 4819] [SDOI 2017] 新生舞会
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴. 有 \(n\) 个男生和 \(n\) 个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴. C ...
- 4819: [Sdoi2017]新生舞会(分数规划)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1031 Solved: 530[Submit][Statu ...
- BZOJ4819 新生舞会
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MB Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学 ...
- 【BZOJ4819】新生舞会(分数规划,网络流)
[BZOJ4819]新生舞会(分数规划,网络流) 题面 BZOJ Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买 ...
- [BZOJ4819][SDOI2017]新生舞会(分数规划+费用流,KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1097 Solved: 566[Submit][Statu ...
- bzoj4819 [Sdoi2017]新生舞会
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的 ...
- [Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]
[Sdoi2017]新生舞会 题意:沙茶01分数规划 貌似\(*10^7\)变成整数更科学 #include <iostream> #include <cstdio> #inc ...
随机推荐
- 装饰模式(Decorator)
装饰模式(Decorator) 顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装 ...
- base64位加密解密
1.base64位加密base64是用于传输8Bit字节代码,由上图的编码表可以知道,编码后的内容只包含这64个字符类型,所以称为base64编码 2.编码过程 : 首先将待编码的内容转换成8位二进制 ...
- Nginx的知识分享,技术分享
3. Nginx常用命令管理及升级 查看nginx进程 ps -ef|grep nginx 说明:nginx的进程由主进程和工作进程组成. 启动nginx nginx 启动结果显示nginx的主线程和 ...
- Spring Cloud 之 Feign
新建Spring Boot工程,命名为feign 1.pom.xml添加依赖 <?xml version="1.0" encoding="UTF-8"?& ...
- eclipse和myeclipse中将项目发布到tomcat的root目录
1.在eclipse中,将项目直接部署在tomcat的root目录中,这样便可以直接ip:port访问项目: 项目右键->属性->web project settings 添加之后直接启动 ...
- linux运维、架构之路-Zabbix监控应用及分布式
一.Zabbix监控集群应用 1.监控端口 net.tcp.listen[port] 检查 TCP 端口 是否处于侦听状态.返回 0 - 未侦听:1 - 正在侦听 net.tcp.port[<i ...
- php综合运用技术
五.PHP综合应用 1.写出下列服务的用途和默认端口(新浪网技术部) ftp.ssh.http.telnet.https ftp:File Transfer Protocol,文件传输协议,是应用层的 ...
- Akka(41): Http:DBTable-rows streaming - 数据库表行交换
在前面一篇讨论里我们介绍了通过http进行文件的交换.因为文件内容是以一堆bytes来表示的,而http消息的数据部分也是byte类型的,所以我们可以直接用Source[ByteString,_]来读 ...
- java桌面程序打包教程
首先打包成j可执行的jar文件. . 接下来找到自己生成jar文件的路径就可以看到jar文件了,我的是在桌面: 在桌面新建一个文件夹(名字随便取,一般去项目名字) 上面是我取的文件夹名字,然后把资料文 ...
- 最全最详细:ubuntu16.04下内核编译以及设备驱动程序的编写(针对新手而写)
写在前面:本博客为本人原创,转载请注明出处!同时,本博客严禁任何下载站随意抓取!!! 本博客唯一合法URL: 总体考虑 要去写设备驱动程序,说白了就三大步骤:下载内核源码构建内核源码树(也就是下载你的 ...