【BZOJ4819】 新生舞会(01分数规划,费用流)
Solution
考虑一下这个东西的模型转换:
\(\frac{\sum_{i=1}^n{a_i}}{\sum_{i=1}^n{b_i}}\)
然后转换一下发现显然是01分数规划。
\(\sum_{i=1}^n{b_i}*mid\leq \sum_{i=1}^n{a_i}\)
然后再移项:
\(0 \leq \sum_{i=1}^n{a_i-b_i*mid}\)
然后就是求一个最大费用最大流判断是不是>0就好了。
口胡简单,实现靠自己
代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi()
{
int f=1,sum=0;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
return f*sum;
}
const int N=210;
const double eps=1e-10,Inf=1e18;
int front[N],to[(N*N)<<2],nxt[(N*N)<<2],w[(N*N)<<2],s=0,t,cnt,vis[N<<2],fa[N<<2],pre[N<<2],n,a[N][N],b[N][N];
double c[(N*N)<<2],dis[N<<2];
void Add(int u,int v,int val,double f){
to[cnt]=v;nxt[cnt]=front[u];front[u]=cnt;w[cnt]=val;c[cnt++]=f;
to[cnt]=u;nxt[cnt]=front[v];front[v]=cnt;w[cnt]=0;c[cnt++]=-f;
}
queue<int>Q;
bool SPFA(){
for(int i=s;i<=t+1;i++)dis[i]=-Inf;
dis[s]=0;
Q.push(s);
while(!Q.empty()){
int u=Q.front();Q.pop();vis[u]=0;
for(int i=front[u];i!=-1;i=nxt[i]){
int v=to[i];
if(w[i] && dis[v]<dis[u]+c[i]){
dis[v]=dis[u]+c[i];fa[v]=u;pre[v]=i;
if(!vis[v]){
vis[v]=1;Q.push(v);
}
}
}
}
return dis[t]!=dis[t+1];
}
double McMf(){
double ans=0;
while(SPFA()){
ans+=dis[t];
for(int i=t;i!=s;i=fa[i]){
w[pre[i]]--;w[pre[i]^1]++;
}
}
return ans;
}
bool check(double mid){
memset(front,-1,sizeof(front));cnt=0;
for(int i=1;i<=n;i++){
Add(s,i,1,0);Add(i+n,t,1,0);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
Add(i,j+n,1,(double)a[i][j]-b[i][j]*mid);
if(McMf()>=0)return true;
return false;
}
int main()
{
n=gi();t=n+n+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=gi();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
b[i][j]=gi();
double l=0,r=10000;
while(r-l>eps){
double mid=l+(r-l)*0.5;
if(check(mid))l=mid;
else r=mid;
}
printf("%.6lf\n",l);
return 0;
}
【BZOJ4819】 新生舞会(01分数规划,费用流)的更多相关文章
- BZOJ-4819: 新生舞会(01分数规划+费用流)
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间 ...
- 【BZOJ4819】[Sdoi2017]新生舞会 01分数规划+费用流
[BZOJ4819][Sdoi2017]新生舞会 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女 ...
- P3705 [SDOI2017]新生舞会 01分数规划+费用流
$ \color{#0066ff}{ 题目描述 }$ 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴. 有\(n\)个男生和\(n\)个女生参加舞会买一个男生和一个女生一 ...
- BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)
BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...
- BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流
BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞 ...
- [Sdoi2017]新生舞会(分数规划+费用流)
题解:二分答案mid,然后将每个位置看成a-b*mid,然后由于是n个男生和n个女生匹配,每个人搭配一个cp,于是有点类似于https://www.lydsy.com/JudgeOnline/prob ...
- BZOJ4819 [Sdoi2017]新生舞会 【01分数规划 + 费用流】
题目 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的关系,比如两个人 ...
- [Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]
[Sdoi2017]新生舞会 题意:沙茶01分数规划 貌似\(*10^7\)变成整数更科学 #include <iostream> #include <cstdio> #inc ...
- BZOJ4819: [Sdoi2017]新生舞会(01分数规划)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1029 Solved: 528[Submit][Status][Discuss] Descripti ...
随机推荐
- openssl初步使用
centos平台 md5.c #include <stdio.h> #include <string.h> #include <stdlib.h> //#inclu ...
- Java学习笔记:多线程(一)
Java中线程的五种状态: 新建状态(New) 就绪状态(Runnable) 运行状态(Running) 阻塞状态(Blocked) 凋亡状态(Dead) 其中阻塞状态(Blocked)又分为三种: ...
- 强连通缩点— HDU1827
强连通缩点以后最终形成的是一棵树 我们可以根据树的性质来看缩点以后的强连通分量图,就很好理解了 /* gyt Live up to every day */ #include<cstdio> ...
- sql创建备份表和复制数据到备份表
1.复制表结构及数据到新表CREATE TABLE 新表 SELECT * FROM 旧表 这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用delete from newtable; ...
- 【转】linux tar 压缩
tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...
- 680. Valid Palindrome II
static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...
- set集合的排序
在hibernate的OneToMany的实体关联的时候,one端的set是无序的,可是需要按照顺序来搞的话就比较麻烦了. 下面给出一个例子. Set<DiaryPicture> diar ...
- Codeforces 1103 简要题解(持续更新)
文章目录 A题 B题 C题 D题 传送门 又一场原地爆炸的比赛. A题 传送门 简单思维题 题意:给一个4∗44*44∗4的格子图和一个01串,你要根据01串放1∗21*21∗2的木块,如果是0就竖放 ...
- hdu-1033(格式)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1033 参考文章:https://blog.csdn.net/curson_/article/detai ...
- 2.Early Education of Children 儿童的早期教育
2.Early Education of Children 儿童的早期教育 (1) In bringing up children,every parent watches eagerly the c ...