[SDOI2017]新生舞会 0/1分数规划
题解:
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分数规划的更多相关文章
- 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 601 Solved: 313 Description 学校 ...
- BZOJ4819 [Sdoi2017]新生舞会 【01分数规划 + 费用流】
题目 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的关系,比如两个人 ...
- 洛谷3705 [SDOI2017] 新生舞会 【01分数规划】【KM算法】
题目分析: 裸题.怀疑$ O(n^4log{n}) $跑不过,考虑Edmonds-Karp优化. 代码: #include<bits/stdc++.h> using namespace s ...
- LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配
#2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- 【BZOJ4819】【SDOI2017】新生舞会 [费用流][分数规划]
新生舞会 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 学校组织了一次新生舞会,Cathy ...
- 【BZOJ4819】 新生舞会(01分数规划,费用流)
Solution 考虑一下这个东西的模型转换: \(\frac{\sum_{i=1}^n{a_i}}{\sum_{i=1}^n{b_i}}\) 然后转换一下发现显然是01分数规划. \(\sum_{i ...
- [Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]
[Sdoi2017]新生舞会 题意:沙茶01分数规划 貌似\(*10^7\)变成整数更科学 #include <iostream> #include <cstdio> #inc ...
- BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流
BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞 ...
- 【BZOJ4819】[Sdoi2017]新生舞会 01分数规划+费用流
[BZOJ4819][Sdoi2017]新生舞会 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女 ...
随机推荐
- nginx下pagespeed使用详解
目录 1.简介 2.安装 2.1脚本安装 查看该脚本的如何使用 使用脚本自动安装 替换以前的nginx 2.2 手动安装 先安装基本依赖 构建pagespeed 重新编译安装nginx 3.配置 3. ...
- 汽车VIN码,车架号,移动端,服务器端OCR识别 技术公司
很多人在购买车辆的时候,只关注性能.外观.内饰等,其实真正的内行是首先看车辆的VIN码,也叫车架号码. VIN码(车架号码)是一辆车的唯一身份证明,一般在车辆的挡风玻璃处,有的在车辆防火墙上,或B柱铭 ...
- Qml-Dialog不能隐藏标题栏和按钮自定义
在项目中,需要弹出一个对话框来完成用户输入的功能,为了考虑界面的同一,这里需要将原生自带的标题栏隐藏掉,换成自己写的 按照widget的写法,可以使用QDialog,但是qml与之对应的Dialog我 ...
- 前端开发工程师 - 03.DOM编程艺术 - 期末考试
期末考试客观题 返回 倒计时: 01:24 1 单选(2分) 以下选项中不是节点类型的是 A. COMMENT_NODE B. DOCUMENT_NODE C. BODY_NODE D. E ...
- Java开发工程师(Web方向) - 02.Servlet技术 - 第4章.JSP
第4章--JSP JSP JSP(Java Server Pages) - 中文名:Java服务器页面 动态网页技术标准 JSP = Html + Java + JSP tags 在服务器端执行,返回 ...
- Python全栈 MongoDB 数据库(Mongo、 正则基础、一篇通)
终端命令: 在线安装: sudo apt-get install mongodb 默认安装路径 : /var/lib/mong ...
- Java学习 · 初识 面向对象深入一
面向对象深入 1.面向对象三大特征 a) 继承 inheritance 子类可以从父类继承属性和方法 子类可以提供自己的属性方法 b) 封装 encapsulation 对外隐藏某些属性和方法 对外公 ...
- 【转】unity 热更新思路和实现
声明:本文介绍的热更新方案是我在网上搜索到的,然后自己修改了一下,相当于是借鉴了别人的思路,加工成了自己的,在此感谢无私分享经验的朋友们. 想要使用热更新技术,需要规划设计好资源比较策略,资源版本,确 ...
- pthon web框架flask(一)
pthon web框架优劣: 知乎上有一个讨论Python 有哪些好的 Web 框架?,从这个讨论中最后我选择了flask,原因是: Django,流行但是笨重,还麻烦,人生苦短,肯定不选 web.p ...
- Dask教程
Dask 介绍 Dask是一款用于分析计算的灵活并行计算库. Dask由两部分组成: 针对计算优化的动态任务调度.这与Airflow,Luigi,Celery或Make类似,但针对交互式计算工作负载进 ...