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 学校 ...
随机推荐
- 谈谈java中的volatile
内存可见性 留意复合类操作 解决num++操作的原子性问题 禁止指令重排序 总结 内存可见性 volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色.同synch ...
- Knockoutjs:Component and Custom Elements(翻译文章)
Knockoutjs 的Components 是一种自定义的组件,它以一种强大.简介的方式将你自己的ui代码组织成一种单独的.可重用的模块,自定义的组件(Component)有以下特点: 1.可以替代 ...
- self-question
需要即刻提升的几大能力: 1.重装系统和安装各种软件 2.自学能力,多从实际案例中总结,多归纳反思 3.拓展人际关系,和别人沟通交流 4.遇到困难迎刃而上,而不是回避退缩
- rem 结合 scss 移动端自适应 初级入门demo
首先说明 本篇 内容 适合初级使用 rem 开发移动端 自适应 公式计算 推导过程, 高手绕路. 目标尺寸 = rem * 根字体大小 Px = rem * (html根字体px) 根字体大 ...
- tomcat常见错误
在这里总结下之前遇到的关于Tomcat的错误: 第一个: web.xml 文件配置的 url-pattern 出现了与其他工程中重名的访问url 在console台可以看到这行报错的代码: Cause ...
- javascript . 04 匿名函数、递归、回调函数、对象、基于对象的javascript、状态和行为、New、This、构造函数/自定义对象、属性绑定、进制转换
匿名函数: 没有名字的函数,函数整体加小括号不报错, 函数调用 : a:直接调用 (function (){函数体}) ( ) ; b:事件绑定 document.onlick = functio ...
- Failed to connect to Xilinx hw_server. Check if the hw_server is running and correct TCP port is used.
Failed to connect to Xilinx hw_server. Check if the hw_server is running and correct TCP port is us ...
- org.springframework.beans.factory.BeanDefinitionStoreException异常
1.下面是我遇到的异常信息: 2017-03-25 18:01:11,322 [localhost-startStop-1][org.springframework.web.context.Conte ...
- SERVLET中的doGet与doPost两个方法之间的区别
get和post是http协议的两种方法,另外还有head, delete等 这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字符串.post的参数是通过另外的 ...
- Nginx+Tomcat动静分离脚本
#!/bin/bashsetenforce 0systemctl stop firewalldtar -zxvf nginx-1.8.0.tar.gz -C /usr/src/ cd /usr/src ...