有一个二分图,每个部都有 \(n\) 个点,每条边有两个参数 \(a_e, b_e\),求一种匹配,使得 \(\sum a_i / \sum b_i\) 最大

Solution

显然的分数规划,考虑二分一个答案 \(mid\),那么设每条边的权值为 \(c_i = a_i - kb_i\)

然后跑二分图最大权匹配,如果跑出来答案大于 \(0\) 就表明 OK,可以将答案调大,否则调小。

KM 在稠密的时候比 MCMF 跑的快点,对这题的话其实都能过吧

#include <bits/stdc++.h>
using namespace std;
#define reset(x) memset(x,0,sizeof x)
#define reset3f(x) memset(x,0x3f,sizeof x)
#define int long long
#define ll long long
// Input: g[v][u] (v in II, u in I)
// Method: solve(n1,n2)
// Output: ans, mat[u] (u in I)
namespace km {
const double inf=1e+9;
const int MX=405;
int n,m;
int py[MX],vy[MX],pre[MX];
double slk[MX],g[MX][MX],kx[MX],ky[MX],ans;
int mat[MX];
void clear() {
n=m=0;
reset(py); reset(vy); reset(pre);
reset(slk); reset(g); reset(kx); reset(ky);
}
void KM(){
int i,j,k,x,p=0;
double d,t;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
kx[i]=max(kx[i],g[i][j]);
for(i=1;i<=n;i++){
memset(vy,0,sizeof(int)*(n+1));
for(j=0;j<=n;j++) slk[j]=inf;
memset(pre,0,sizeof(int)*(n+1));
for(py[k=0]=i;py[k];k=p){
d=inf;vy[k]=1;x=py[k];
for(j=1;j<=n;j++)if(!vy[j]){
if((t=kx[x]+ky[j]-g[x][j])<slk[j])slk[j]=t,pre[j]=k;
if(slk[j]<d)d=slk[j],p=j;
}
for(j=0;j<=n;j++)
if(vy[j])kx[py[j]]-=d,ky[j]+=d;
else slk[j]-=d;
}
for(;k;k=pre[k])py[k]=py[pre[k]];
}
} void solve(int n1,int n2){
n=max(n1,n2);
KM();
ans=0;
for(int i=1;i<=n;i++)ans+=kx[i]+ky[i];
for(int i=1;i<=n1;i++)mat[i]=(g[py[i]][i]?py[i]:0);
}
} int n;
double a[105][105],b[105][105]; signed main() {
cin>>n;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j];
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>b[i][j];
double l=0,r=1e+9;
while(r-l>1e-8) {
double mid=(l+r)/2;
km::clear();
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
km::g[j][i]=a[i][j]-mid*b[i][j];
}
}
km::solve(n,n);
if(km::ans>0) l=mid;
else r=mid;
}
printf("%.6lf",l);
}

[SDOI2017] 新生舞会 - 二分图最大权匹配,分数规划,二分答案的更多相关文章

  1. 【Luogu】P3705新生舞会(费用流+分数规划+二分答案)

    题目链接 本来以为自己可以做出来,结果……打脸了 (貌似来wc立了好几个flag了,都没竖起来) 不过乱蒙能蒙出一个叫“分数规划”的东西的式子还是很开心的 观察$C=\frac{a_{1}+a_{2} ...

  2. [BJOI2019]奥术神杖——AC自动机+DP+分数规划+二分答案

    题目链接: [BJOI2019]奥术神杖 答案是$ans=\sqrt[c]{\prod_{i=1}^{c}v_{i}}=(\prod_{i=1}^{c}v_{i})^{\frac{1}{c}}$. 这 ...

  3. poj2728 生成树01分数规划 (二分答案)

    给定整数序列a,b,求出下式的最大值 sum{ai*xi}/sum{bi*xi},xi=0|1 通俗来说,就是选出一些整数对(ai,bi),使得选出的a之和与选出的b之和商最大化 二分答案L,即选出的 ...

  4. BZOJ 4819 [Sdoi2017]新生舞会 ——费用流 01分数规划

    比值最大 分数规划 二分答案之后用费用流进行验证. 据说标称强行乘以1e7换成了整数的二分. 不过貌似实数二分也可以过. #include <map> #include <cmath ...

  5. hdu6070(分数规划/二分+线段树区间更新,区间最值)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意: 给出一个题目提交序列, 从中选出一个正确率最小的子串. 选中的子串中每个题目当且仅当最 ...

  6. [Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]

    [Sdoi2017]新生舞会 题意:沙茶01分数规划 貌似\(*10^7\)变成整数更科学 #include <iostream> #include <cstdio> #inc ...

  7. BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流

    BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞 ...

  8. [BZOJ4819][SDOI2017]新生舞会(分数规划+费用流,KM)

    4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1097  Solved: 566[Submit][Statu ...

  9. 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)

    4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 601  Solved: 313 Description 学校 ...

随机推荐

  1. CentOS7安装MySQL报错,解决Failed to start mysqld.service: Unit not found

    当输入命令 ~]# systemctl start mysql.service 要启动MySQL数据库是却是这样的提示 Failed to start mysqld.service: Unit not ...

  2. 01.JS语法规范、变量与常量

    前言:    学习一门编程语言的基本步骤   (01)了解背景知识  (02)搭建开发环境  (03)语法规范  (04)常量和变量 2.JS的开发环境 (1)浏览器自带的JS解释器(js引擎) (2 ...

  3. Python中verbaim标签使用详解

    verbatim标签:默认在"DTL"模板中是会去解析那些特殊字符串的,比如{% 和 %}以及{{等.如果你在某个代码片段中不想使用"DTL"的解析引擎,那么就 ...

  4. Blazor初体验之寻找存储client-side jwt token的方法

    https://www.cnblogs.com/chen8854/p/securing-your-blazor-apps-authentication-with-clientside-blazor-u ...

  5. 【转】JS 的 new 到底是干什么的?

    原文:https://zhuanlan.zhihu.com/p/23987456?refer=study-fe 大部分讲 new 的文章会从面向对象的思路讲起,但是我始终认为,在解释一个事物的时候,不 ...

  6. spark集群

    https://blog.csdn.net/boling_cavalry/article/details/86747258 https://www.cnblogs.com/xuliangxing/p/ ...

  7. MySQL 8 用户定义函数

    MySQL Server可以通过创建或者加载UDFs(User-Defined Functions)来扩展服务器功能. 通过CREATE FUNCTION语句加载 UDF,比如: CREATE FUN ...

  8. HDOJ1384 Intervals 题解

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1384 大意:有 \(n\) 个区间 \([a_i,b_i]\),每个区间有个权值 \(c_i\),找到 ...

  9. 剑指offer-面试题50-第一个只出现一次的字符-哈希表

    /* 题目: 求字符串第一个只出现一次的字符. */ /* 思路: 使用map遍历两次,第一次计数,第二次找到计数为1的第一个字符. */ #include<iostream> #incl ...

  10. BZOJ #2506. calc [根号分治,莫队,二分]

    \(p\) 是个正常范围, \(\sqrt p <= 100\) 比较小,预处理出来 \(a_i % p == k\) 的位置,然后丢进去,最后询问的 \(p\) 如果大于 \(100\) 就莫 ...