#2003. 「SDOI2017」新生舞会

内存限制:256 MiB时间限制:1500 ms标准输入输出
题目类型:传统评测方式:文本比较
上传者: 匿名

题目描述

学校组织了一次新生舞会,Cathy 作为经验丰富的老学姐,负责为同学们安排舞伴。

有 n nn 个男生和 n nn 个女生参加舞会,一个男生和一个女生一起跳舞,互为舞伴。
Cathy 收集了这些同学之间的关系,比如两个人之前是否认识,计算得出 ai,j a_{i, j}a​i,j​​,表示第 i ii 个男生和第 j jj 个女生一起跳舞时他们喜悦程度。
Cathy 还需要考虑两个人一起跳舞是否方便,比如身高体重差别会不会太大,计算得出 bi,j b_{i, j}b​i,j​​ 表示第 i ii 个男生和第 j jj 个女生一起跳舞时的不协调裎度。

当然,还需要考虑很多其他间题。

Cathy 想先用一个程序通过 ai,j a_{i, j}a​i,j​​ 和 bi,j b_{i, j}b​i,j​​ 求出一种方案,再手动对方案进行微调。
Cathy 找到你,希望你帮她写那个程序。

一个方案中有 n nn 对舞伴,假设每对舞伴的喜悦程度分别是 a1′,a2′,…,an′ a'_1, a'_2, \ldots, a'_na​1​′​​,a​2​′​​,…,a​n​′​​,假设每对舞伴不协调程度分别是 b1′,b2′,…,bn′ b'_1, b'_2, \ldots, b'_nb​1​′​​,b​2​′​​,…,b​n​′​​。令

C=a1′+a2′+⋯+an′b1′+b2′+⋯+bn′ C = \frac{a'_1 + a'_2 + \cdots + a'_n}{b'_1 + b'_2 + \cdots + b'_n}C=​b​1​′​​+b​2​′​​+⋯+b​n​′​​​​a​1​′​​+a​2​′​​+⋯+a​n​′​​​​

Cathy 希望 C 值最大。

输入格式

第一行一个整数 n nn。
接下来 n nn 行,每行 n nn 个正整数,第 i ii 行第 j jj 个数表示 ai,j a_{i, j}a​i,j​​。
接下来 n nn 行,每行 n nn 个正整数,第 i ii 行第 j jj 个数表示 bi,j b_{i, j}b​i,j​​。

输出格式

一行一个数,表示 C CC 的最大值。四舍五入保留六位小数,选手输出的小数需要与标准输出相等。

样例

样例输入

3
19 17 16
25 24 23
35 36 31
9 5 6
3 4 2
7 8 9

样例输出

5.357143

数据范围与提示对于 10% 10\%10% 的数据,1≤n≤5 1 \leq n \leq 51≤n≤5;

对于 40% 40\%40% 的数据,1≤n≤18 1 \leq n \leq 181≤n≤18;
另外存在 20% 20\%20% 的数据,bi,j=1 b_{i, j} = 1b​i,j​​=1;
对于 100% 100\%100% 的数据,1≤n≤100,1≤ai,j≤104,1≤bi,j≤104 1 \leq n \leq 100, 1 \leq a_{i, j} \leq 10 ^ 4,1 \leq b_{i, j} \leq 10 ^ 41≤n≤100,1≤a​i,j​​≤10​4​​,1≤b​i,j​​≤10​4​​。

传送一篇来自苣苣的博客:01分数规划总结

感觉01分数规划就是先二分答案,然后再求最值。

题目链接:https://loj.ac/problem/2003

题意:选出n对舞伴,使得价值和/代价和最大。

思路:基础01分数规划+最大权匹配(可以使用最小费用流求解,先对费用取负数,最后答案再取负数)

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<queue>
#include<stack>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int maxn=,maxm=1e5+,inf=0x3f3f3f3f,mod=1e9+;
const ll INF=1e18+;
const double eps=1e-;
int a[maxn][maxn],b[maxn][maxn];
struct edge
{
int from,to;
int c;
int a,b;
};
vector<edge>es;
vector<int>G[maxn];
double dist[maxn];
int pre[maxn];
void addedge(int u,int v,int c,int a,int b)
{
es.push_back((edge)
{
u,v,c,a,b
});
es.push_back((edge)
{
v,u,,-a,-b
});
int x=es.size();
G[u].push_back(x-);
G[v].push_back(x-);
}
bool SPFA(int s,int t,double mid)
{
static std::queue<int> q;
static bool inq[maxn];
for(int i=; i<maxn; i++) dist[i]=1.0*inf,inq[i]=false;
pre[s]=-;
dist[s]=0.0;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
inq[u]=false;
for(int i=; i<G[u].size(); i++)
{
edge e=es[G[u][i]];
double d=0.0;
if(e.a&&e.b) d=1.0*e.a-mid*e.b;
if(e.c&&dist[e.to]>dist[u]-d)
{
pre[e.to]=G[u][i];
dist[e.to]=dist[u]-d;
if(!inq[e.to]) q.push(e.to),inq[e.to]=true;
}
}
}
return fabs(inf-dist[t])>eps;
}
double dinic(int s,int t,int f,double mid)
{
int flow=;
double cost=0.0;
while(SPFA(s,t,mid))
{
int d=f;
for(int i=t; i!=s; i=es[pre[i]].from)
d=min(d,es[pre[i]].c);
f-=d;
flow+=d,cost+=d*dist[t];
for(int i=t; i!=s; i=es[pre[i]].from)
{
es[pre[i]].c-=d;
es[pre[i]^].c+=d;
}
if(f<=) break;
}
for(int i=; i<es.size(); i+=) es[i].c=,es[i+].c=;
//cout<<-1*cost<<" ******"<<endl<<endl;
return -*cost;
}
bool check(double mid,int s,int t,int n)
{
return dinic(s,t,n,mid)>=eps?true:false;
}
int main()
{
int n,m;
scanf("%d",&n);
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
scanf("%d",&a[i][j]);
}
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
scanf("%d",&b[i][j]);
}
int s=,t=*n+;
for(int i=; i<=n; i++) addedge(s,i,,,);
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
addedge(i,j+n,,a[i][j],b[i][j]);
}
for(int i=; i<=n; i++) addedge(i+n,t,,,);
double l=0.0,r=1000000000.0;
double ans=0.0;
while((r-l)>eps)
{
double mid=(l+r)/;
//printf("%.8f %.8f %.8f\n",l,r,mid);
if(check(mid,s,t,n)) l=mid,ans=l;
else r=mid;
}
printf("%.6f\n",ans);
return ;
}

基础01分数规划+最大权匹配

LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配的更多相关文章

  1. LibreOJ #2003. 「SDOI2017」新生舞会

    内存限制:256 MiB 时间限制:1500 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: 匿名 01分数规划(并不知道这是啥..) km或费用流(并不会)验证 屠龙宝刀点击就送 ...

  2. 「SDOI2017」新生舞会

    题目链接 戳我 \(Describe\) 有一场舞会,n个男生,n个女生,要组成n对舞伴,男生i和女生j组队的适合度是\(a_{ij}\), 不适合度是\(b_{ij}\), 让你求\(max(\su ...

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

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

  4. BZOJ4819 [Sdoi2017]新生舞会 【01分数规划 + 费用流】

    题目 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的关系,比如两个人 ...

  5. 【BZOJ4819】【SDOI2017】新生舞会 [费用流][分数规划]

    新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 学校组织了一次新生舞会,Cathy ...

  6. loj2003 「SDOI2017」新生舞会

    分数规划+KM 算法 这个KM不好,看算法竞赛进阶指南的 #include <iostream> #include <cstring> #include <cstdio& ...

  7. 洛谷3705 [SDOI2017] 新生舞会 【01分数规划】【KM算法】

    题目分析: 裸题.怀疑$ O(n^4log{n}) $跑不过,考虑Edmonds-Karp优化. 代码: #include<bits/stdc++.h> using namespace s ...

  8. 【BZOJ4819】 新生舞会(01分数规划,费用流)

    Solution 考虑一下这个东西的模型转换: \(\frac{\sum_{i=1}^n{a_i}}{\sum_{i=1}^n{b_i}}\) 然后转换一下发现显然是01分数规划. \(\sum_{i ...

  9. [SDOI2017]新生舞会 0/1分数规划

    ---题面--- 题解: 0/1分数规划,,,但是竟然有诡异的精度问题???因为这个被卡了好久 中途还写过一次KM,,,结果陷入死循环,,,我大概是写了一个假KM,,,于是放弃KM,回来调费用流 这个 ...

随机推荐

  1. vue 语法糖

    el:element 需要获取的元素,一定是HTML中的根容器元素data:用于数据的存储methods:用于存储各种方法数据绑定字面量只加载一次{{* msg}}data里面可以进行简单的运算:me ...

  2. Java将一个字符串的首位改为大写后边改为小写的实现,String

    Java将一个字符串的首位改为大写后边改为小写的实现,String 思路: 获取首字母, charAt(0) substring(0,1) 转成大写 toUpperCase() 转大写hellO=== ...

  3. java程序重要节点

    1.前台页面 2.前台页面到controller层跳转 和controller层的承上启下(jsp页面和java程序的桥梁) 3.serviceIpmle 程序处理的逻辑层 3.mybatis操作数据 ...

  4. GreenDao在列中的单词之间自动加_

    1.第一种情况,原字段(属性.列)是 驼峰式命名法 @Entitypublic class Employee { @Id(autoincrement = true) private Long id; ...

  5. Ext.js多文件选择上传,

    工作了之后来到了一家用Ext.js的公司, 一开始的时候做项目, 我被分给一个做一个单表的增删改查, 再加上文件上传功能, 带我的老师让我自己研究一下Ext.js怎么多文件选择上传, 并且能获取到上传 ...

  6. apache服务器伪静态配置说明

    apache服务器伪静态配置说明: 第一种 .如果是多城市版分类并且使用了城市二级域名即(多城市+多域名),请修改apache的配置文件,把以下代码添加到配置文件的最后一行即可,注意把qibosoft ...

  7. numpy.random.uniform()

    numpy.random.uniform均匀分布 2018年06月19日 23:28:03 徐小妹 阅读数:4238   numpy.random.uniform介绍: 1. 函数原型:  numpy ...

  8. VIM初掌握

    Vim 是 Linux 系统上的最著名的文本/代码编辑器,也是早年的 Vi 编辑器的加强版.它的最大特色是完全使用键盘命令进行编辑,脱离了鼠标操作虽然使得入门变得困难,但上手之后键盘的各种巧妙组合操作 ...

  9. PHP如何处理yyyyMMddHHmmssSSSZ?

    PHP如何处理yyyyMMddHHmmssSSSZ? 更新: 2016-01-05 12:45 作者: wecandoitforev PHP编程中,时间,日期的应用是必不可少的.有一种日期格式:yyy ...

  10. stark组件之pop操作【模仿Django的admin】

    一.先看下什么django的admin的pop到底是个什么东西 其实就是这么一个东西, a.在添加页面,在一对多和多对多的项后加了一个+号 b.点击这个加号,会弹出对应的添加 页面,在新的添加 c.添 ...