有一个二分图,每个部都有 \(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);
}

最新文章

  1. cat命令使用
  2. 开发人员必读openstack网络基础
  3. vux 表单提交数据 返回后页面跳转
  4. Java中数据类型及其之间的转换
  5. Objective-C、C++和swift 的运行效率比较
  6. leetcode 36
  7. 批量处理csv格式转换成xls
  8. MapReduce 规划 系列的12 使用Hadoop Streaming技术集成newLISP文字
  9. HDU 3726 Graph and Queries 平衡树+前向星+并查集+离线操作+逆向思维 数据结构大综合题
  10. vue-cli脚手架npm相关文件解读(6)build.js
  11. TCP/IP协议栈 ARP和RARP协议
  12. .NET Core 迁移躺坑记
  13. linux中mariadb的安装
  14. TypeScript 快速学习
  15. Eclipse+pydev+手动安装
  16. IDEA之Git分支以及Stash使用
  17. HDU1789 Doing Homework again 做作业【贪心】
  18. 20165327 2017-2018-2 《Java程序设计》第8周学习总结
  19. idea中pom文件需要添加的依赖
  20. 安卓下H5弹窗display:table的bug

热门文章

  1. 学会springboot多环境配置方案不用5分钟
  2. Vue中的$Bus使用
  3. 共同战“疫”,CODING 帮助研发团队高效协同
  4. sed命令简介
  5. Codeforces Round 450 D 隔板法+容斥
  6. 如何利用dokcer提交我的比赛代码
  7. 这 100 道 Python 题,拿去刷!!!
  8. Android中通过Fragment进行简单的页面切换
  9. hadoop学习摘要
  10. js内置对象的常用属性和方法(Array | String | Date | Math)