【Luogu】P3705新生舞会(费用流+分数规划+二分答案)
本来以为自己可以做出来,结果……打脸了
(貌似来wc立了好几个flag了,都没竖起来)
不过乱蒙能蒙出一个叫“分数规划”的东西的式子还是很开心的
观察$C=\frac{a_{1}+a_{2}+.......+a_{n}}{b_{1}+b_{2}+.....b_{n}}$
然后可以把分母乘到左边
然后可以把C乘进去
然后二分C,建图求最大权匹配,判断跟答案的关系。
#include<cstdio>
#include<cstdlib>
#include<cctype>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#define maxn 450
#define eps 1e-7
using namespace std; inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct Edge{
int from,next,to,val;
double dis;
}edge[maxn*maxn*];
int head[maxn],num;
inline void addedge(int from,int to,int val,double dis){
edge[++num]=(Edge){from,head[from],to,val,dis};
head[from]=num;
}
inline void add(int from,int to,int val,double dis){
addedge(from,to,val,dis);
addedge(to,from,,-dis);
}
inline void clear(){ memset(head,,sizeof(head)); num=; }
inline int count(int i){ return i&?i+:i-; } double dis[maxn];
int pre[maxn];
int flow[maxn];
bool vis[maxn];
int d[maxn][maxn];
int w[maxn][maxn];
int Start,End;
int n; double spfa(){
for(int i=Start;i<=End;++i) dis[i]=-0x7fffffff; dis[Start]=;
queue<int>q; q.push(Start); memset(flow,,sizeof(flow)); flow[Start]=0x7fffffff;
while(!q.empty()){
int from=q.front(); q.pop(); vis[from]=;
for(int i=head[from];i;i=edge[i].next){
int to=edge[i].to;
if(edge[i].val<=||dis[to]>=dis[from]+edge[i].dis) continue;
dis[to]=dis[from]+edge[i].dis;
pre[to]=i; flow[to]=min(flow[from],edge[i].val);
if(vis[to]) continue;
vis[to]=; q.push(to);
}
}
if(flow[End]==) return ;
int now=End;
while(now!=Start){
//printf("D");
int i=pre[now];
edge[i].val-=flow[End];
edge[count(i)].val+=flow[End];
now=edge[i].from;
}
return dis[End];
} bool payflow(double lim){
clear();
for(int i=;i<=n;++i){
add(Start,i,,);
add(i+n,End,,);
}
for(int i=;i<=n;++i)
for(int j=;j<=n;++j) add(i,j+n,,1.0*d[i][j]-1.0*w[i][j]*lim);
double ret=;
while(){
double now=spfa();
if(fabs(now)<=eps) break;
ret+=now;
}
return ret>;
} int main(){
n=read(); End=n*+;
for(int i=;i<=n;++i)
for(int j=;j<=n;++j) d[i][j]=read();
for(int i=;i<=n;++i)
for(int j=;j<=n;++j) w[i][j]=read();
double l=,r=1e4;double ans=;
while(r-l>eps){
double mid=(l+r)/2.0;
if(payflow(mid)){
ans=mid;
l=mid;
}
else r=mid;
}
printf("%.6lf",ans);
return ;
}
【Luogu】P3705新生舞会(费用流+分数规划+二分答案)的更多相关文章
- 【BZOJ4819】【SDOI2017】新生舞会 [费用流][分数规划]
新生舞会 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 学校组织了一次新生舞会,Cathy ...
- BZOJ 4819 [Sdoi2017]新生舞会 ——费用流 01分数规划
比值最大 分数规划 二分答案之后用费用流进行验证. 据说标称强行乘以1e7换成了整数的二分. 不过貌似实数二分也可以过. #include <map> #include <cmath ...
- BZOJ4819 [Sdoi2017]新生舞会 【01分数规划 + 费用流】
题目 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的关系,比如两个人 ...
- 【BZOJ4819】 新生舞会(01分数规划,费用流)
Solution 考虑一下这个东西的模型转换: \(\frac{\sum_{i=1}^n{a_i}}{\sum_{i=1}^n{b_i}}\) 然后转换一下发现显然是01分数规划. \(\sum_{i ...
- 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 601 Solved: 313 Description 学校 ...
- LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配
#2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- [SDOI2017]新生舞会 0/1分数规划
---题面--- 题解: 0/1分数规划,,,但是竟然有诡异的精度问题???因为这个被卡了好久 中途还写过一次KM,,,结果陷入死循环,,,我大概是写了一个假KM,,,于是放弃KM,回来调费用流 这个 ...
- [SDOI2017] 新生舞会 - 二分图最大权匹配,分数规划,二分答案
有一个二分图,每个部都有 \(n\) 个点,每条边有两个参数 \(a_e, b_e\),求一种匹配,使得 \(\sum a_i / \sum b_i\) 最大 Solution 显然的分数规划,考虑二 ...
- [BJOI2019]奥术神杖——AC自动机+DP+分数规划+二分答案
题目链接: [BJOI2019]奥术神杖 答案是$ans=\sqrt[c]{\prod_{i=1}^{c}v_{i}}=(\prod_{i=1}^{c}v_{i})^{\frac{1}{c}}$. 这 ...
随机推荐
- [论文理解]Selective Search for Object Recognition
Selective Search for Object Recognition 简介 Selective Search是现在目标检测里面非常常用的方法,rcnn.frcnn等就是通过selective ...
- 2018.5.9 Oracle数据库查询命令
0.查询所有数据(最简单,但是时间很久) select * from emp; Result: EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- - ...
- SC || 那些CheckStyle中的错误们
lab5里给了我们一个checkstyle查代码风格的方法.. 然后 lab4代码 copy一份! 添加checkstyle! 项目 右键 checkstyle!(自信脸) 3s后——7256 war ...
- javaweb基础(10)_HttpServletRequest原理介绍
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- iOSAES加密的实现
+(NSData *)AES256ParmEncryptWithKey:(NSString *)key Encrypttext:(NSData *)text //加密 { char keyPtr[k ...
- Github使用技巧总结
<config> PyCharm与GitHub配置使用总结 <readme> 在github的readme添加图片 github readme写法 GitHub上README. ...
- Oracle 数据库常用SQL语句(2)查询语句
一.SQL基础查询 1.select语句 格式:select 字段 from 表名; 2.where 用于限制查询的结果. 3.查询条件 > < >= <= = != 4.与 ...
- linux关于进程、内存和cpu情况
1.load average: 2.03, 1.76, 1.80 1分钟.5分钟.15分钟平均负载 2.%Cpu(s):100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa ...
- jCarousel,jQuery下的滚动切换传送插件
转自:http://www.zhangxinxu.com/jq/jcarousel_zh/#Examples 介绍 jCarousel是一款 jQuery 插件, 用来控制水平或垂直排列的列表项. 这 ...
- JFinal 结合Dubbo发生的一些问题
1.java.lang.NoSuchMethodError: org.jboss.resteasy.specimpl.BuiltResponse.getHeaders()Ljavax/ws/rs/co ...