~~~题面~~~

题解:

0/1分数规划,,,但是竟然有诡异的精度问题???因为这个被卡了好久

中途还写过一次KM,,,结果陷入死循环,,,我大概是写了一个假KM,,,于是放弃KM,回来调费用流

这个题面也很直白啊~~~

我们令C>=x,

然后二分求出最大的x即可,

每次跑费用流前重新定义边权

a[i] - mid * b[i]

然后跑最大费用最大流看看跑出来能不能有大于0的费用就可以了

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 410
#define ac 40000
#define eps 1e-7
#define inf -9000000000LL
#define getchar() *o++
#define D printf("line in %d\n",__LINE__);
char READ[],*o=READ;
int n,s,t;
double maxn,mid,ans;
int tmp[AC][AC],last[AC];
int Head[AC],Next[ac],date[ac],haveflow[ac],disflow[AC],tot=;
double dis[ac],cost[ac],a[ac],b[ac];
bool z[AC];
deque <int> q;
/*01分数规划,二分x,然后跑最大费用最大流,看费用是否大于等于0,大于等于0即合法。
1 ~ n 为女生,n+1 ~ 2*n 为男生 ,s = 2*n+1 ,t = 2*n+2*/ inline int read()
{
int x=;char c=getchar();
while(c > '' || c < '') c=getchar();
while(c >= '' && c <='') x=x*+c-'',c=getchar();
return x;
} inline void add(int f,int w,int aa,int bb)
{
date[++tot]=w,Next[tot]=Head[f],Head[f]=tot,a[tot]=aa,b[tot]=bb;
date[++tot]=f,Next[tot]=Head[w],Head[w]=tot;
} inline void upmax(double &a,double b)
{
if(b > a) a = b;
} void pre()
{
int a;
n=read();
s= * n + ,t= * n + ;
for(R i=;i<=n;i++)
for(R j=;j<=n;j++)
tmp[i][j]=read();
for(R i=;i<=n;i++)
for(R j=;j<=n;j++)
{
a=read();
add(i,n + j,tmp[i][j],a);
upmax(maxn,(double)tmp[i][j] / (double)a);
}
for(R i=;i<=n;i++) add(s,i,,);
for(R i=n+;i<=*n;i++) add(i,t,,);
} void aru()
{
int x=t;
while(x != s)
{
haveflow[last[x]] -= disflow[x];//是减掉disflow[x]啊
haveflow[last[x] ^ ] += disflow[x];
x=date[last[x] ^ ];
}
ans += disflow[t] * dis[t]; } bool spfa()
{
int x,now;
z[s]=true,dis[s]=,disflow[s]=INT_MAX;
q.push_front(s);
while(!q.empty())
{
x=q.front();
q.pop_front();
z[x]=false;
for(R i=Head[x]; i ;i=Next[i])
{
now=date[i];
if(haveflow[i] && dis[now] < dis[x] + cost[i])
{
dis[now] = dis[x] + cost[i];
disflow[now] = min(haveflow[i],disflow[x]);//是用当前边!的haveflow和当前点!的disflow的比较
last[now] = i;
if(!z[now] && now != t)//t当然不能进来了
{
if(!q.empty() && dis[now] > dis[q.front()]) q.push_front(now);
else q.push_back(now);
z[now]=true;
}
}
}
}
x=t;
if(dis[t] != inf) aru();
return dis[t] != inf;
} bool check()
{
int bb=n * + ;
for(R i=;i<=bb;i++) dis[i]=inf;//要手动inf,,error!!!怎么可以改了下面不改这里,,,
ans=;
for(R i=;i<=tot;i+=)//枚举正向边
{
haveflow[i] = ;//所有边默认流量都为1
haveflow[i+] = ;//反向边当然是0
cost[i] = a[i] - mid * b[i];
cost[i+] = -cost[i];//重新建图
}
while(spfa()) //貌似因为是double,所以memset 128不好用了
for(R i=;i<=bb;i++) dis[i] = inf;
return ans >= ;
} void half()
{
double l=,r=;
while(r - l > eps)
{
mid = (l + r) / ;//因为是实数,所以没有什么偏向问题
if(check()) l = mid;
else r = mid;//error!!!!!!!!所以说是因为-eps才错的?
}//啊啊啊啊啊啊啊啊啊啊那为什么不能减啊!!!!!!!!
printf("%.6lf\n",l);
} int main()
{
// freopen("in.in","r",stdin);
fread(READ,,,stdin);
pre();
half();
// fclose(stdin);
return ;
}

[SDOI2017]新生舞会 0/1分数规划的更多相关文章

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

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

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

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

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

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

  4. LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配

    #2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

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

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

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

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

  7. [Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]

    [Sdoi2017]新生舞会 题意:沙茶01分数规划 貌似\(*10^7\)变成整数更科学 #include <iostream> #include <cstdio> #inc ...

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

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

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

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

随机推荐

  1. NB-IOT连接基站需要的步骤

    本次使用华为海思Hi2110芯片,657SP3版本软件,利尔达的NB-IOT模块,串口波特率9600,基本需要5个AT指令. 1.上电之后设置IEMI号码,见模组上面的标签.AT+NTSETID=1, ...

  2. 《绝地求生大逃杀》BE错误怎么办 BE服务未正常运行及安装失败解决方法

    <绝地求生大逃杀>BattlEye Launcher是游戏的反作弊程序,也是启动过程中做容易出现错误的,今天小编带来“爆锤吧务”分享的<绝地求生大逃杀>BE服务未正常运行及安装 ...

  3. android学习十一 高级调试分析功能

    1.debug 功能列表 2.ddms功能( 内存检查,线程检查,视图层次分析) 3.跟踪代码 TraceView 4.命令行工具 adb 5.策略检查StrictMode

  4. 一次IPC无法创建的问题

    背景说明:         后台子系统都是运行在pc上的linux         系统有多个子系统,有一个子系统负责统一启停其他子系统,这里把这个子系统称为olddriver.         ol ...

  5. 了解和分析iOS Crash

    WeTest 导读 北京时间凌晨一点,苹果一年一度的发布会如期而至.新机型的发布又会让适配相关的同学忙上一阵子啦,并且iOS Crash的问题始终伴随着移动开发者.本文将从三个阶段,由浅入深的介绍如何 ...

  6. 使用advanced_installer将.net web程序打包为安装程序

    当项目开发完成之后,需要给客户使用时,总不能将发布后的文件全部放一起压缩后直接给客户吧,然后客户需要自行搭建环境修改配置等等,体验太差了,这时候我们就需要使用一种打包工具了,查了一些资料之后,我选择使 ...

  7. Unity初探之黑暗之光(1)

    Unity初探之黑暗之光(1) 1.镜头拉近 public float speed=10f;//镜头的移动速度 ;//镜头的结束位置 // Update is called once per fram ...

  8. netty in action 笔记 二

    netty的数据容器 网络数据的基本单位大多为字节,Java NIO 提供了ByteBuffer 作为它的字节容器,但使用起来过于复杂和繁琐.在Netty中, ByteBuffer 替代品是ByteB ...

  9. java学习笔记-9.违例差错控制

      1.违例规范是告诉程序员这个方法可能抛出哪些类型的异常.他的格式在方法声明中,位于自变量(参数)列表的后面,如void f() throws tooBig, tooSmall, divZero { ...

  10. crt0.S(_main)代码分析

    crt0,S(_main)代码分析 --- 1. 设置sp寄存器地址 //设置SP栈指针 #if defined(CONFIG_SPL_BUILD) && defined(CONFIG ...