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 学校 ...
随机推荐
- Python3处理配置文件
1.说明:python3使用configparser模块来处理ini配置文件.2.代码示例:需要生成conf.ini配置文件如下:[config]v1 = 100v2 = abcv3 = truev4 ...
- iOS多线程——GCD
最近的项目遇到了很多多线程的问题,借此机会对GCD进行了一番学习并总结.首先说一下什么是GCD,GCD全称 Grand Central Dispatch,是异步执行任务的技术之一.开发者只需要定义想要 ...
- 图解Javascript——作用域、作用域链、闭包
什么是作用域? 作用域是一种规则,在代码编译阶段就确定了,规定了变量与函数的可被访问的范围.全局变量拥有全局作用域,局部变量则拥有局部作用域. js是一种没有块级作用域的语言(包括if.for等语句的 ...
- SQL Server--获取磁盘空间使用情况
对于DBA来说,监控磁盘使用情况是必要的工作,然后没有比较简单的方法能获取到磁盘空间使用率信息,下面总结下这些年攒下的脚本: 最常用的查看磁盘剩余空间,这个属于DBA入门必记的东西: -- 查看磁盘可 ...
- 撸一个Android高性能日历控件,高仿魅族
Android原生的CalendarView根本无法满足我们日常开发的需要,在开发吾记APP的过程中,我觉得需要来一款高性能且美观简洁的日历控件,觉得魅族的日历风格十分适合,于是打算撸一款. gith ...
- 获取JVM的dump文件
获取JVM的dump文件的两种方式 1. JVM启动时增加两个参数: #出现 OOME 时生成堆 dump: -XX:+HeapDumpOnOutOfMemoryError #生成堆文件地址: -XX ...
- 开源一个vue2的tree组件
一直打算偷懒使用个现成的树组件,但是在github上找了一大圈没有找到真正满足应用开发的树组件,所以没办法只能自己写了一个,开源出来希望可以帮助到需要的人,同时如果大家觉得好用,我可以顺带骗骗★(希望 ...
- freemarker导出word文档——WordXML格式解析
前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...
- HackerRank The Chosen One [预处理][gcd]
题解:tags:[预处理][gcd]故事背景:光头钻进了茫茫人海.这是一个典型の通过前缀后缀和来降低复杂度的问题.先用pre数组与suf数组分别维护前缀gcd和后缀gcd.如果 a[i] % gcd( ...
- GDOI2014模拟pty爬山(mountain)
pty爬山(mountain) 在Pty学校附近,有一座名之为岳之麓的高山.Pty很喜欢和(哔--)一起爬山.山的平面模型如下:山由一个顶点集:A1,A2-An给定,保证Ai的x单调递增.我们将Ai和 ...