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

Solution

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

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

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

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define reset(x) memset(x,0,sizeof x)
  4. #define reset3f(x) memset(x,0x3f,sizeof x)
  5. #define int long long
  6. #define ll long long
  7. // Input: g[v][u] (v in II, u in I)
  8. // Method: solve(n1,n2)
  9. // Output: ans, mat[u] (u in I)
  10. namespace km {
  11. const double inf=1e+9;
  12. const int MX=405;
  13. int n,m;
  14. int py[MX],vy[MX],pre[MX];
  15. double slk[MX],g[MX][MX],kx[MX],ky[MX],ans;
  16. int mat[MX];
  17. void clear() {
  18. n=m=0;
  19. reset(py); reset(vy); reset(pre);
  20. reset(slk); reset(g); reset(kx); reset(ky);
  21. }
  22. void KM(){
  23. int i,j,k,x,p=0;
  24. double d,t;
  25. for(i=1;i<=n;i++)
  26. for(j=1;j<=n;j++)
  27. kx[i]=max(kx[i],g[i][j]);
  28. for(i=1;i<=n;i++){
  29. memset(vy,0,sizeof(int)*(n+1));
  30. for(j=0;j<=n;j++) slk[j]=inf;
  31. memset(pre,0,sizeof(int)*(n+1));
  32. for(py[k=0]=i;py[k];k=p){
  33. d=inf;vy[k]=1;x=py[k];
  34. for(j=1;j<=n;j++)if(!vy[j]){
  35. if((t=kx[x]+ky[j]-g[x][j])<slk[j])slk[j]=t,pre[j]=k;
  36. if(slk[j]<d)d=slk[j],p=j;
  37. }
  38. for(j=0;j<=n;j++)
  39. if(vy[j])kx[py[j]]-=d,ky[j]+=d;
  40. else slk[j]-=d;
  41. }
  42. for(;k;k=pre[k])py[k]=py[pre[k]];
  43. }
  44. }
  45. void solve(int n1,int n2){
  46. n=max(n1,n2);
  47. KM();
  48. ans=0;
  49. for(int i=1;i<=n;i++)ans+=kx[i]+ky[i];
  50. for(int i=1;i<=n1;i++)mat[i]=(g[py[i]][i]?py[i]:0);
  51. }
  52. }
  53. int n;
  54. double a[105][105],b[105][105];
  55. signed main() {
  56. cin>>n;
  57. for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j];
  58. for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>b[i][j];
  59. double l=0,r=1e+9;
  60. while(r-l>1e-8) {
  61. double mid=(l+r)/2;
  62. km::clear();
  63. for(int i=1;i<=n;i++) {
  64. for(int j=1;j<=n;j++) {
  65. km::g[j][i]=a[i][j]-mid*b[i][j];
  66. }
  67. }
  68. km::solve(n,n);
  69. if(km::ans>0) l=mid;
  70. else r=mid;
  71. }
  72. printf("%.6lf",l);
  73. }

[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. js中如果遇到低版本安卓设备调用setTimeout不生效解决办法

    工作中会遇到低版本安卓设备调用setTimeout不生效,既不会报错,里面的函数也不会执行,这里po一个解决办法,如果不执行则执行安卓自己封装的原生的setTimeout方法:sdk.setTimeo ...

  2. SpringCloud之eureka注册中心入门

    eureka注册中心 一.基本概念 SpringCloud封装 了Netflix公司的eureka作为自己微服务的注册中心.这个注册中心和dubbo中的zookeeper很相似,简单来说,只要你可以将 ...

  3. RestTemplate + okhttp 实现远程调用

    1. 添加依赖 <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --> <dependency ...

  4. MySql学习-2. NavicatforMySQL 与 MySql的对接以及一些操作:

    1.连接: 2.数据库的创建: 3.数据库中表的创建:    4.表的设计: 4.1 设计表: 4.2 增加数据(自动递增只是保证唯一值,即使数据删除了也是得前进):

  5. 应用场景不同,是无代码和低代码的最大区别 ZT

    随着媒体对低代码.无代码等先进技术的持续关注,我们发现大多数人都听说过低代码开发和无代码开发这两个概念,但是对两者之间的区别其实并不清楚.事实上,低代码开发和无代码开发之间存在着很多非常显著的差异,如 ...

  6. .net core 3.0配置跨域

    1.ConfigureServices services.AddCors(c => { // 配置策略 c.AddPolicy("Policy", policy => ...

  7. Ubuntu 搭建phpcms

    安装Apache2 $ sudo apt-get update -y $ sudo apt-get install apache2 -y $ sudo systemctl start apache2. ...

  8. 由于找不到opencv_world320d.dll,无法继续执行代码。解决方案

    将 opencv 安装路径 目录\opencv\build\x64\vc14\bin 中 3 个后缀是.dll 的应用程序扩展复制到 C:\Windows\System32 中 完美解决!

  9. lint-staged 使用教程

    lint-staged 是一个在git暂存文件上运行linters的工具,当然如果你觉得每次修改一个文件就给所有文件执行一次lint检查不恶心的话,这个工具对你来说就没有什么意义了,请直接关闭即可. ...

  10. 导航贴 | IT Crypt 密码学优秀博文

    Base64编码: 什么是Base64? 一篇文章彻底弄懂Base64编码原理 Morse密码: 看似神秘,实则简单的装逼利器-摩斯密码 Bacon 密码: 密码学笔记 -- 培根密码 RSA 加密: ...