【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}}$. 这 ...
随机推荐
- spring security 2.x HttpSessionEventPublisher 以及listener配置
在环境为spring security2.x时 *JDK6 spring 2* 正确的filter路径是:org.springframework.security.ui.session.HttpSes ...
- Tarjan 详解
Tarjan 算法 一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度. 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连 ...
- idea中pom.xml没有工作 IDEA中maven项目pom.xml依赖不生效解决
问题: 今天在web项目中需要引入poi相关jar包.查看之下才发现pom.xml中的依赖虽然已经下载到了本地仓库 repository,但是却没有加入到项目路径的 Extenal Libraries ...
- C++实现Singleton模式(effective c++ 04)
阅读effective c++ 04 (31页) 提到的singleton设计模式.了解一下. 定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享. 应用场景: 比 ...
- PAT 乙级 1051
题目 题目地址:PAT 乙级 1051 思路 最近做题发现一个比较明显的现象——总是在做简单题的过程中出现这样那样的小问题,究其原因我认为还是有很多细节性的知识没有掌握,这是在以后的学习过程中需要注意 ...
- 【思维题 kmp 构造】bzoj4974: [Lydsy1708月赛]字符串大师
字符串思博题这一块还是有点薄弱啊. Description 一个串T是S的循环节,当且仅当存在正整数k,使得S是T^k(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节 .给定一个长度 ...
- k8s调度的预选策略及优选函数
scheduler调度过程: Predicate(预选)-->Priority(优选)-->Select(选定)调度方式: 1.节点亲和性调度(NodeAffinity)使用n ...
- C#基础-判断语句
switch语句 Console.WriteLine("请输入月份"); string strInput = Console.ReadLine(); switch(strInput ...
- 腾讯云Ubuntu服务器修改root密码
1.修改root密码 执行以下命令,按照提示修改密码 sudo passwd root 2.修改ssh配置 执行以下命令 sudo vi /etc/ssh/sshd_config 找到 PermitR ...
- jQuery发送ajax请求实现跨域访问
Java代码的话,在返回响应之前调用如下代码中的allowCrossDomainAccess()方法: /** * 允许跨域访问 */ public void allowCrossDomainAcce ...