[Sdoi2017]新生舞会

题意:沙茶01分数规划


貌似\(*10^7\)变成整数更科学

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
#define fir first
#define sec second
const int N=205, INF=1e9, M=1e5+5;
const double eps=1e-10;
inline int read() {
char c=getchar(); int x=0, f=1;
while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
return x*f;
} int n, s, t, a[N][N], b[N][N]; namespace cf {
struct edge{int v, ne, c, f; double w;} e[M];
int cnt=1, h[N];
inline void ins(int u, int v, int c, double w) { //printf("ins %d %d %lf\n",u,v,w);
e[++cnt]=(edge){v, h[u], c, 0, w}; h[u]=cnt;
e[++cnt]=(edge){u, h[v], 0, 0, -w}; h[v]=cnt;
} int q[N], head, tail, inq[N]; double d[N];
int pre[N], pos[N];
inline void lop(int &x) {if(x==N) x=1;}
int tt=0;
bool spfa() { //printf("spfa %d\n", ++tt);
memset(inq, 0, sizeof(inq));
for(int i=s; i<=t; i++) d[i] = -INF;
head=tail=1;
q[tail++]=s; inq[s]=1; d[s]=0;
pre[t] = -1;
while(head != tail) {
int u = q[head++]; lop(head); inq[u]=0; //if(tt==2)printf("u %d\n", u);
for(int i=h[u];i;i=e[i].ne) {
int v = e[i].v; //printf("v %d %d %lf\n",v, e[i].c>e[i].f, d[v]);
if(e[i].c > e[i].f && d[v] < d[u] + e[i].w ) {
d[v] = d[u] + e[i].w;
pre[v] = u; pos[v] = i;
if(!inq[v]) {
inq[v] = 1;
if(d[v] > d[q[head]]) head--, lop(head), q[head] = v;
else q[tail++] = v, lop(tail);
}
}
}
}
return pre[t] != -1;
} double ek() {
int flow=0; double cost=0;
while(spfa()) {
int x, f=INF;
for(int i=t; i!=s; i=pre[i]) x=pos[i], f = min(f, e[x].c - e[x].f);
flow += f;
cost += d[t]*f; //printf("ek %d %d %lf\n",f,flow,(double)cost);
for(int i=t; i!=s; i=pre[i]) x=pos[i], e[x].f += f, e[x^1].f -= f;
} return cost;
} bool check(double mid) { //printf("check %lf\n",mid);
s=0; t=n+n+1;
cnt=1; memset(h, 0, sizeof(h));
for(int i=1; i<=n; i++) ins(s, i, 1, 0), ins(i+n, t, 1, 0);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) ins(i, j+n, 1, (double) a[i][j] - mid*b[i][j]);
return ek() > eps;
} void solvebequone() {
s=0; t=n+n+1;
cnt=1; memset(h, 0, sizeof(h));
for(int i=1; i<=n; i++) ins(s, i, 1, 0), ins(i+n, t, 1, 0);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) ins(i, j+n, 1, (double)a[i][j]);
double ans = ek();
printf("%.6lf", ans / n);
}
} void solve() {
double l=0, r=1e4;
while(r-l > 1e-7) {
double mid = (l+r)/2.0; //printf("mid %lf\n", mid);
if(cf::check(mid)) l=mid;
else r=mid;
}
printf("%.6lf", l);
} int main() {
freopen("ball.in", "r", stdin);
freopen("ball.out", "w", stdout); n=read();
int flag=0;
for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) a[i][j]=read();
for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) {b[i][j]=read(); if(b[i][j] != 1) flag=1;}
if(!flag) cf::solvebequone();
else solve(); //printf("\n\ntime %lf\n", (double)clock()/CLOCKS_PER_SEC);
}

[Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]的更多相关文章

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

    [BZOJ4819][Sdoi2017]新生舞会 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女 ...

  2. P3705 [SDOI2017]新生舞会 01分数规划+费用流

    $ \color{#0066ff}{ 题目描述 }$ 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴. 有\(n\)个男生和\(n\)个女生参加舞会买一个男生和一个女生一 ...

  3. BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)

    BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...

  4. BZOJ4819: [Sdoi2017]新生舞会(01分数规划)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1029  Solved: 528[Submit][Status][Discuss] Descripti ...

  5. BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流

    BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞 ...

  6. BZOJ-4819: 新生舞会(01分数规划+费用流)

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

  7. 4819: [Sdoi2017]新生舞会(分数规划)

    4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1031  Solved: 530[Submit][Statu ...

  8. [Sdoi2017]新生舞会(分数规划+费用流)

    题解:二分答案mid,然后将每个位置看成a-b*mid,然后由于是n个男生和n个女生匹配,每个人搭配一个cp,于是有点类似于https://www.lydsy.com/JudgeOnline/prob ...

  9. 【BZOJ4819】新生舞会(分数规划,网络流)

    [BZOJ4819]新生舞会(分数规划,网络流) 题面 BZOJ Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买 ...

随机推荐

  1. 利用dfs解决规定路程问题

    今天继续dfs的训练,遇到了一道神题,不停地TLE,我DD都快碎了.....好在经过本渣不懈努力,还是弄了出来,不容易啊,发上来纪念一下,顺便总结一下关于用dfs解决规定路程的问题. 先上题目: De ...

  2. JS数组中shift()和push(),unshift()和pop()操作方法使用

    Javascript为数组专门提供了push和pop()方法,以便实现类似栈的行为.来看下面的例子: var colors=new Array();       //创建一个数组 var count= ...

  3. c++extern关键字详解

    1 基本解释 :extern可以置于变量或者函数 前,以标示变量或者函数的定义在别的文件中 ,提示编译器遇到此变量和函数时在其他模块中寻找其定义 .此外extern也可用来进行链接指定. 也就是说ex ...

  4. SpringMVC框架学习笔记(4)——结果跳转方式

    1.设置ModelAndView对象.根据View和视图解析器跳转到指定页面(视图解析器前缀+viewname+视图解析器后缀) @Override public ModelAndView handl ...

  5. 云计算之路-阿里云上:节点 CPU 波动引发 docker swarm 集群故障

    非常抱歉,今天 10:05-10:20 左右,我们用阿里云服务器搭建的 docker swarm 集群又出现故障,又是因为突然的节点 CPU 波动. 受这次故障影响的站点有 闪存,博问,班级,园子,短 ...

  6. Dede 删除文档同时文章中的图片的方法

    首先,在"/include"目录下建立"extend.func.php"文件. 然后,将以下内容保存在"extend.func.php"文件 ...

  7. 那些年~~~我们的C#笔试内测题目

    <深入.NET平台和C#编程>内部测试题-笔试试卷 一 选择题 1) 以下关于序列化和反序列化的描述错误的是( C). a) 序列化是将对象的状态存储到特定存储介质中的过程 b) 二进制格 ...

  8. 【开发技术】java中代码检查checkStyle结果分析

    编写Javadoc代码在Java代码的类.函数.数据成员前中输入/**回车,Eclipse能够自动生成相应的Javadoc代码.可以在后面添加相关的文字说明. Type is missing a ja ...

  9. 【开发技术】java异常的捕获与抛出原则

    在可能会出现exception的地方,要使用try-catch或者throws或者两者都要.我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-cat ...

  10. winform打开本地html页面

    有时候为了提高开发效率和后期可维护性,把cs里面嵌套了远程网页,这样方便后期升级.比如,美图秀秀,qq音乐PC都嵌套了本地和远程网页.在页面拖入控件System.Windows.Forms.WebBr ...