bzoj4819 [Sdoi2017]新生舞会
Description
Input
Output
Sample Input
19 17 16
25 24 23
35 36 31
9 5 6
3 4 2
7 8 9
Sample Output
正解:$01$分数规划+费用流。
好吧其实这题正解好像是$KM$算法,不过忘记写了。。
这是一道经典的$01$分数规划的问题,要解决这类问题,我们首先考虑二分答案。
如果$\frac{\sum_{i=1}^{n}a^{'}i}{\sum_{i=1}^{n}b^{'}i}>mid$
即$\sum_{i=1}^{n}a^{'}i>mid\sum_{i=1}^{n}b^{'}i$
$\sum_{i=1}^{n}a^{'}i-mid*b^{'}i>0$,那么$ans$就会更大。
所以我们每次跑费用流的费用就是$a[i][j]-mid*b[i][j]$,我们要求出这个图的最大费用最大流,那么我们把费用取反就行了。
然后我们判断这个费用是否可行,再二分就行了。实数二分,$eps$大概取$10^{-7}$吧。。
//It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define inf (1e18)
#define eps (1e-7)
#define N (510)
#define il inline
#define RG register
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; struct edge{
int nt,to,flow,cap;
double dis;
}g[]; int head[N],f[N],vis[N],fa[N],p[N],a[N][N],b[N][N],q[],S,T,n,num,flow;
double dis[N],cost,ans; il int gi(){
RG int x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
return q*x;
} il void insert(RG int from,RG int to,RG int cap,RG double cost){
g[++num]=(edge){head[from],to,,cap,cost},head[from]=num; return;
} il int bfs(RG int S,RG int T){
for (RG int i=;i<=T;++i) dis[i]=inf;
RG int h=,t=; q[t]=S,dis[S]=,f[S]=<<,vis[S]=;
while (h<t){
RG int x=q[++h],v;
for (RG int i=head[x];i;i=g[i].nt){
v=g[i].to;
if (dis[v]>dis[x]+g[i].dis && g[i].cap>g[i].flow){
dis[v]=dis[x]+g[i].dis,fa[v]=x,p[v]=i;
f[v]=min(f[x],g[i].cap-g[i].flow);
if (!vis[v]) vis[v]=,q[++t]=v;
}
}
vis[x]=;
}
if (fabs(dis[T]-inf)<eps) return ;
flow+=f[T],cost+=f[T]*dis[T];
for (RG int i=T;i!=S;i=fa[i])
g[p[i]].flow+=f[T],g[p[i]^].flow-=f[T];
return ;
} il int check(RG double key){
RG double res; memset(head,,sizeof(head)),num=;
for (RG int i=;i<=n;++i){
insert(S,i,,),insert(i,S,,);
insert(n+i,T,,),insert(T,n+i,,);
}
for (RG int i=;i<=n;++i)
for (RG int j=;j<=n;++j){
res=a[i][j]-key*b[i][j];
insert(i,n+j,,-res),insert(n+j,i,,res);
}
flow=cost=; while (bfs(S,T)); return cost<eps;
} il void work(){
n=gi(),S=*n+,T=*n+;
for (RG int i=;i<=n;++i)
for (RG int j=;j<=n;++j) a[i][j]=gi();
for (RG int i=;i<=n;++i)
for (RG int j=;j<=n;++j) b[i][j]=gi();
RG double l=0.0,r=100000.0,mid;
while (fabs(r-l)>eps){
mid=(l+r)/;
if (check(mid)) ans=mid,l=mid; else r=mid;
}
printf("%0.6lf",ans); return;
} int main(){
File("ball");
work();
return ;
}
bzoj4819 [Sdoi2017]新生舞会的更多相关文章
- [BZOJ4819][SDOI2017]新生舞会(分数规划+费用流,KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1097 Solved: 566[Submit][Statu ...
- BZOJ4819 [Sdoi2017]新生舞会 【01分数规划 + 费用流】
题目 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的关系,比如两个人 ...
- BZOJ4819: [Sdoi2017]新生舞会(01分数规划)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1029 Solved: 528[Submit][Status][Discuss] Descripti ...
- bzoj4819 [Sdoi2017]新生舞会 分数规划+最大费用最大流
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4819 题解 首先上面说, \[ C = \frac{\sum\limits_{i=1}^n a ...
- 【BZOJ4819】[Sdoi2017]新生舞会 01分数规划+费用流
[BZOJ4819][Sdoi2017]新生舞会 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女 ...
- [Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]
[Sdoi2017]新生舞会 题意:沙茶01分数规划 貌似\(*10^7\)变成整数更科学 #include <iostream> #include <cstdio> #inc ...
- BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流
BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞 ...
- 洛谷 P3705 [SDOI2017]新生舞会 解题报告
P3705 [SDOI2017]新生舞会 题目描述 学校组织了一次新生舞会,\(Cathy\)作为经验丰富的老学姐,负责为同学们安排舞伴. 有\(n\)个男生和\(n\)个女生参加舞会买一个男生和一个 ...
- 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 601 Solved: 313 Description 学校 ...
随机推荐
- Linux下httpd服务与Apache服务的查看和启动
转:http://jingyan.baidu.com/article/63f236282d43170209ab3d43.html 这里简要介绍Linux环境中Apache也就是httpd服务的启动,查 ...
- 2.sparkSQL--DataFrames与RDDs的相互转换
Spark SQL支持两种RDDs转换为DataFrames的方式 使用反射获取RDD内的Schema 当已知类的Schema的时候,使用这种基于反射的方法会让代码更加简洁而且效果也很好. 通 ...
- iOS开发之Quartz2D
1. Quartz2D概述及作用 Quartz2D的API是纯C语言的,Quartz2D的API来自于Core Graphics框架. 数据类型和函数基本都以CG作为前缀,比如: CG ...
- Openstack新建云主机的流程
前言 前天晚上没睡觉,所以昨天睡得很早,导致今天4点就起来了 时间是人最宝贵的财富,于是我打消了钻在被子里刷剧的念头,爬起来整理一下在Openstack中新建一个云主机的流程. Openstack可以 ...
- piwik安装部署最佳实践
1.piwik介绍 Piwik是一个PHP和MySQL的开放源代码的Web统计软件,它给你一些关于你的网站的实用统计报告,比如网页浏览人数,访问最多的页面,搜索引擎关键词等等. Piwik拥有众多不同 ...
- 【转】JSON和JSONP
前言 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Soc ...
- 老李秘技:LoadRunner支持参数文件极限是多大
老李秘技:LoadRunner支持参数文件极限是多大 Controller不支持参数文件大于20m
- java实现截屏
import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit ...
- 轻量级代码生成器-OnlyCoder
程序猿利器:代码生成器,使用代码生成器已经好几年了,增删改查各种生成,从UI到DATA层均生成过.之前有使用过动软的,T4模板等.... T4生成实体还是没有问题的,但是生成MVC视图就有点烦杂了, ...
- 图的基本算法(BFS和DFS)(转载)
图是一种灵活的数据结构,一般作为一种模型用来定义对象之间的关系或联系.对象由顶点(V)表示,而对象之间的关系或者关联则通过图的边(E)来表示. 图可以分为有向图和无向图,一般用G=(V,E)来表示图. ...