codevs 5965 [SDOI2017]新生舞会


分数规划的裸题。
不会分数规划的OIer。百度:胡伯涛《最小割模型在信息学竞赛中的应用》
/*
TLE1:
last:add(i,j+n,1e9,(real)((real)a[i][j]-ans*(real)b[i][j]));
now :add(i,j+n,1,(real)((real)a[i][j]-ans*(real)b[i][j]));
TLE2:
last:real l=eps,r=(real)u/(real)v,mid,ans=0,now;
now :real l=0,r=(real)(u+v-1)/(real)v,mid,ans=0,now;
TLE3:
last:struct edge{int v,next;real cost,cap;}e[N<<1];
now :to[N],next[N],cap[N];real cost[N];(结构体跑得慢)
TLE4:
last:typedef long double real;
now :typedef double real;
*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#define set(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);
using namespace std;
const int N=1e5+;
const int Z=;
typedef long double real;
const real eps=1e-;
int n,m,S,T,a[Z][Z],b[Z][Z];
int to[N],next[N],cap[N];real cost[N];int tot=,head[N];
real dis[N];int q[N],pre[N];bool vis[N];
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void add(int x,int y,int z,real Cost){
to[++tot]=y;cap[tot]=z;cost[tot]=Cost;next[tot]=head[x];head[x]=tot;
to[++tot]=x;cap[tot]=;cost[tot]=-Cost;next[tot]=head[y];head[y]=tot;
}
bool spfa(){
memset(vis,,sizeof vis);
for(int i=;i<=T+;i++) dis[i]=-1e9;
unsigned short h=,t=;q[t]=S;dis[S]=;
while(h!=t){
int x=q[++h];vis[x]=;
for(int i=head[x];i;i=next[i]){
if(cap[i]>&&dis[to[i]]<dis[x]+cost[i]){
dis[to[i]]=dis[x]+cost[i];
pre[to[i]]=i;
if(!vis[to[i]]){
vis[to[i]]=;
q[++t]=to[i];
}
}
}
}
return dis[T]>-1e9;
}
real augment(){
// int flow=1e9;
// for(int i=T;i!=S;i=to[pre[i]^1]) flow=min(flow,cap[pre[i]]);
int flow=;
for(int i=T;i!=S;i=to[pre[i]^]){
cap[pre[i]]-=flow;
cap[pre[i]^]+=flow;
}
return dis[T]*flow;
}
real mapping(real ans){
tot=;S=;T=n<<|;
memset(head,,sizeof head);
for(int i=;i<=n;i++) add(S,i,,),add(i+n,T,,);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
add(i,j+n,,(real)((real)a[i][j]-ans*(real)b[i][j]));
}
}
real res=0.0;
while(spfa()) res+=augment();
return res;
}
int cmp(real x){
if(fabs(x)<eps) return ;
return x>?:-;
}
void work1(){
tot=;S=;T=n<<|;
memset(head,,sizeof head);
for(int i=;i<=n;i++) add(S,i,,),add(i+n,T,,);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
add(i,j+n,,(real)a[i][j]);
}
}
real res=0.0;
while(spfa()) res+=augment();
res/=1.0*n;
printf("%.6lf\n",(double)res);
}
int main(){
set(ball);
n=read();
int u=,v=;
for(int i=,t;i<=n;i++){
t=;
for(int j=;j<=n;j++){
a[i][j]=read();
t=max(t,a[i][j]);
}
u+=t;
}
bool f=;
for(int i=,t;i<=n;i++){
t=1e9;
for(int j=;j<=n;j++){
b[i][j]=read();
t=min(t,b[i][j]);
if(b[i][j]!=) f=;
}
v+=t;
}
if(f){work1();return ;}
real l=,r=(real)(u+v-)/(real)v,mid,ans=,now;
while(l+eps<r){
mid=(l+r)/2.0;
now=mapping(mid);
if(cmp(now)==){printf("%.6lf\n",(double)mid);return ;}
if(cmp(now)>) l=mid;
else r=mid;
}
printf("%.6lf\n",(double)l);
fclose(stdin);
fclose(stdout);
return ;
}
codevs 5965 [SDOI2017]新生舞会的更多相关文章
- [Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]
[Sdoi2017]新生舞会 题意:沙茶01分数规划 貌似\(*10^7\)变成整数更科学 #include <iostream> #include <cstdio> #inc ...
- BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流
BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞 ...
- 洛谷 P3705 [SDOI2017]新生舞会 解题报告
P3705 [SDOI2017]新生舞会 题目描述 学校组织了一次新生舞会,\(Cathy\)作为经验丰富的老学姐,负责为同学们安排舞伴. 有\(n\)个男生和\(n\)个女生参加舞会买一个男生和一个 ...
- 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 601 Solved: 313 Description 学校 ...
- 【BZOJ4819】[Sdoi2017]新生舞会 01分数规划+费用流
[BZOJ4819][Sdoi2017]新生舞会 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女 ...
- [BZOJ4819][SDOI2017]新生舞会(分数规划+费用流,KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1097 Solved: 566[Submit][Statu ...
- 【算法】01分数规划 --- HNOI2009最小圈 & APIO2017商旅 & SDOI2017新生舞会
01分数规划:通常的问法是:在一张有 \(n\) 个点,\(m\) 条边的有向图中,每一条边均有其价值 \(v\) 与其代价 \(w\):求在图中的一个环使得这个环上所有的路径的权值和与代价和的比率最 ...
- 4819: [Sdoi2017]新生舞会(分数规划)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1031 Solved: 530[Submit][Statu ...
- 题解:SDOI2017 新生舞会
题解:SDOI2017 新生舞会 Description 学校组织了一次新生舞会,Cathy 作为经验丰富的老学姐,负责为同学们安排舞伴. 有 \(n\) 个男生和 \(n\) 个女生参加舞会.一个男 ...
随机推荐
- 阿里云 部署并开启nodejs应用
1.下载资源 $ wget https://nodejs.org/dist/v8.11.2/node-v8.11.2-linux-x64.tar.xz 2.xz解压 $ xz -d node-v8. ...
- getconf命令【一天一个命令】
我们时常需要查询系统相关的信息,比如页面大小,整数大小之类,如果编写程序去计算会比较繁琐,这里有一个很有用的命令,可以用来获取系统相关信息.它就是getconf. $ getconf PAGE_S ...
- linux 使用FIO测试磁盘iops 方法详解
FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎, 包括:sync,mmap, libaio, posixaio, SG v3, splice, null, ...
- verilog gtkwave
gtkwave,开源波形显示软件 来自 bluesky1 博客.http://blog.sina.com.cn/s/blog_566ca6330100c0t3.html~type=v5_one& ...
- rpc 理解
RPC=Remote Produce Call 是一种技术的概念名词. HTTP是一种协议,RPC可以通过HTTP来实现,也可以通过Socket自己实现一套协议来实现. rpc是一种概念,http也是 ...
- Android中<uses-sdk>属性和target属性分析
1. 概要 <uses-sdk> 用来描述该应用程序可以运行的最小和最大API级别,以及应用程序开发者设计期望运行的平台版本.通过在manifest清单文件中添加该属性,我们可以更好的控制 ...
- js代码中定义后台java中的上下文路径
var href = <c:out value='${sessionScope.contextPath}' />
- 方程式漏洞之复现window2008/win7 远程命令执行漏洞
前几天就想写的,因为一些缘故就没写.此次是在外网环境下进行的.大家在内网中也一个样. 方法: 使用Eternalblue模块,剑测是否有漏洞然后msf生成一个dll直接反弹shell. PS:win版 ...
- Datatable添加数据,提示该行已经属于另一个表的解决方法
一.DataTable.Rows.Add(DataRow.ItemArray); 二.DataTable.ImportRow(DataRow) 三.设置DataTable的tablename,然后.R ...
- jquery 排除重复
应用场景——双盒选择器 两个select可能会出现重复的情况 排除重复代码如下: /** * 删除$fromGroup中与$toGroup重复的option * @param $fromGroup = ...
