[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个女生参加舞会 买一个男生和一个女 ...
随机推荐
- spring boot 数据库连接
server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/jdjk?serverTimezone=Asia/Sha ...
- HTML5心得
1. 在做登录或搜索框的时候,可以为input加上autofocus属性,这样打开页面焦点自动在登录框或搜索框中.减少用户不必要的定位点击. 如<label>Search:<inpu ...
- php随机类型验证码
开发使用验证码的意义就是为了区别操作者是人还是机器,防止自动脚本对服务器造成灾难性的攻击 目前有各种各样的验证码种类,譬如:静态字符验证码.算术验证码.拖拽验证码.识别文字或识别物品验证码(高级),下 ...
- requests,lxml爬启信宝
首先, 添加requests模块: 然后, 添加lxml模块: 启信宝登录抓包: QiXinBao.py: import requestsfrom lxml import etree loginUrl ...
- ConfigHelpers
--默认值可以不传 local ConfigHelpers = {} --设置物体高亮 target:设置对象 isLigth:是否高亮 seeThrough:是否穿透(默认为true,穿透) sta ...
- 【20180807模拟测试】t1 function
low逼的我也只能写这样的水题... 题面 对于一个整数,定义 f(x)为他的每个数位的阶乘的乘积.例如 f(135)=1! * 3! * 5! =720.给出一个数 a(可以包含前缀零),a 满足他 ...
- 单机部署Fastfds+nginx
一.环境 centos6.8 x64 IP:192.168.134.128 所需软件包: libfastcommon-1.0.7.zip,FastDFS_v5.05.tar.gz,nginx-1.7 ...
- C Program基础-宏定义
写好c语言,漂亮的宏定义是非常重要的,我们在阅读别人工程时,往往能看到大量的宏定义,宏定义可以增加代码的可读性,也能增加代码的可移植性,一个好的宏定义甚至是一件艺术品.今天我们就来看看宏定义的方方面面 ...
- 接口_requests_基于python
HTTP request python官方文档:http://cn.python-requests.org/zh_CN/latest/ 1. 环境 基于环境,需要安装requests 模块,安装方法 ...
- js随机数算法
function rnd( seed ){ seed = ( seed * 9301 + 49297 ) % 233280; //为何使用这三个数? return seed / ( 233280.0 ...