BZOJ4819 新生舞会
4819: [Sdoi2017]新生舞会
Time Limit: 10 Sec Memory Limit: 128 MB
Description
Input
Output
Sample Input
19 17 16
25 24 23
35 36 31
9 5 6
3 4 2
7 8 9
Sample Output
题解
分数规划 + 网络流
二分C值,设当前C值为C', 每对人对答案的贡献为\( a - b * C' \),费用流使贡献总和最大,为正则说明C'可行。
使用迭代会使效率更高,每次费用流都是在找一个尽量更优或可行的答案,所以我们把费用流跑出的方案记录下来,作为下一次的C'值。
每次迭代结束比较上一次的C'与现在跑出来的C'',差的绝对值小于eps则找到最优解,C'的初始值任意。
代码
/* Stay hungry, stay foolish. */
#include<iostream>
#include<algorithm>
#include<queue>
#include<string>
#include<map>
#include<vector>
#include<set>
#include<sstream>
#include<stack>
#include<ctime>
#include<cmath>
#include<cctype>
#include<climits>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<iomanip>
#include<bitset>
#include<complex>
using namespace std;
/*
#define getchar() getc()
char buf[1<<15],*fs,*ft;
inline char getc() {return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin)),fs==ft)?0:*fs++;}
*/
template <class _T> inline void read(_T &_x) {
int _t; bool _flag=false;
while((_t=getchar())!='-'&&(_t<''||_t>'')) ;
if(_t=='-') _flag=true,_t=getchar(); _x=_t-'';
while((_t=getchar())>=''&&_t<='') _x=_x*+_t-'';
if(_flag) _x=-_x;
}
typedef long long LL;
const int maxn = ;
const int maxm = ;
const double eps = 1e-;
struct Edge {
int v, from, nxt, flow; double cost;
Edge() {}
Edge(int a, int b, int c, double d): v(a), nxt(b), flow(c), cost(d) {}
}e[maxm];
int fir[maxn], ecnt, pre[maxn], preu[maxn];
double dis[maxn]; bool vis[maxn];
inline void addedge(int a, int b, int c, double d) {
e[++ecnt] = Edge(b, fir[a], c, d), fir[a] = ecnt;
e[++ecnt] = Edge(a, fir[b], , -d), fir[b] = ecnt;
}
int n, sink, a[maxn][maxn], b[maxn][maxn];
inline bool spfa() {
memset(dis, 0xfe, sizeof (double) * (sink + ));
memset(vis, false, sizeof (bool) * (sink + ));
double DMIN = dis[];
queue<int> q; dis[] = , q.push();
while (!q.empty()) {
int now = q.front(); q.pop(); vis[now] = false;
for (int u = fir[now]; u; u = e[u].nxt) if (e[u].flow) {
if (dis[e[u].v] < dis[now] + e[u].cost) {
dis[e[u].v] = dis[now] + e[u].cost;
pre[e[u].v] = now, preu[e[u].v] = u;
if (!vis[e[u].v]) {
vis[e[u].v] = true;
q.push(e[u].v);
}
}
}
}
return dis[sink] != DMIN;
}
double augment() {
int now = sink;
while (now != ) {
e[preu[now]].flow -= ;
e[preu[now] ^ ].flow += ;
now = pre[now];
}
return dis[sink];
}
double mcmf() {
double ret = ;
while (spfa()) {
ret += augment();
}
return ret;
}
double Run(double ans) {
ecnt = ;
memset(fir, , sizeof (int) * (sink + ));
for (int i = ; i <= n; ++i) {
for (int j = ; j <= n; ++j) {
addedge(i, j + n, , a[i][j] - ans * b[i][j]);
}
}
for (int i = ; i <= n; ++i) addedge(, i, , );
for (int i = ; i <= n; ++i) addedge(n + i, sink, , );
mcmf();
int ansa = , ansb = ;
for (int i = ; i <= n; ++i) {
for (int u = fir[i]; u; u = e[u].nxt) {
if (e[u].flow == && e[u].v > n && e[u].v < sink) {
ansa += a[i][e[u].v - n], ansb += b[i][e[u].v - n];
}
}
}
return (double)ansa / ansb;
}
int main() {
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
read(n); sink = n + n + ;
for (int i = ; i <= n; ++i) for (int j = ; j <= n; ++j)
read(a[i][j]);
for (int i = ; i <= n; ++i) for (int j = ; j <= n; ++j)
read(b[i][j]);
double prev, ans = ;
do {
prev = ans, ans = Run(ans);
} while (fabs(ans - prev) > eps);
printf("%.6lf", ans);
return ;
}
BZOJ4819 新生舞会的更多相关文章
- BZOJ-4819: 新生舞会(01分数规划+费用流)
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间 ...
- 【BZOJ4819】[Sdoi2017]新生舞会 01分数规划+费用流
[BZOJ4819][Sdoi2017]新生舞会 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女 ...
- 【BZOJ4819】新生舞会(分数规划,网络流)
[BZOJ4819]新生舞会(分数规划,网络流) 题面 BZOJ Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买 ...
- bzoj4819 [Sdoi2017]新生舞会
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的 ...
- 【BZOJ4819】【SDOI2017】新生舞会 [费用流][分数规划]
新生舞会 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 学校组织了一次新生舞会,Cathy ...
- [BZOJ4819][SDOI2017]新生舞会(分数规划+费用流,KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1097 Solved: 566[Submit][Statu ...
- 【bzoj4819】[Sdoi2017]新生舞会 分数规划+费用流
题目描述 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的关系,比如两个 ...
- BZOJ4819 [Sdoi2017]新生舞会 【01分数规划 + 费用流】
题目 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的关系,比如两个人 ...
- BZOJ4819: [Sdoi2017]新生舞会(01分数规划)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1029 Solved: 528[Submit][Status][Discuss] Descripti ...
随机推荐
- day1 学习历程
day1 我是一个在校大三学生,一个依然迷茫不知前景的大学混子= =,可以这么说吧 大学混子 真正开始决定好好学习大概在去年的12月份 那时经老师的提醒 开始正式接触软件开发 于是 从头开始学习语言 ...
- centos7防火墙操作
启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status firewalld 开机禁用 : s ...
- Delphi 判断一个字符串是否为数字
//函 数 名: IsDigit//返 回 值: boolean//日 期:2011-03-01//参 数: String//功 能: 判断一个字符串是否为数字// ...
- python利用unittest测试框架组织测试用例的5种方法
利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所 ...
- jmeter提取正则表达式中所有关联值-----我想获取所有的ID
[{ "ID": 1, "Name": "张三" }, { "ID": 2, "Name": &qu ...
- Statement和PreparedStatement之间的区别
Statement和PreparedStatement之间的区别: 1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程2.使用 Statement ...
- Subsets II - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Subsets II - LeetCode 注意点 有重复的数字 数组可能是无序的,要先排序 解法 解法一:递归,只需要在Subsets中递归写法的基础上 ...
- 洛谷 P3698 [CQOI2017]小Q的棋盘 解题报告
P3698 [CQOI2017]小Q的棋盘 题目描述 小 Q 正在设计一种棋类游戏. 在小 Q 设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上 ...
- Mac上安装mariadb
1.查看mariadb包信息 # brew info mariadb mariadb: stable 10.2.6 (bottled) Drop-in replacement for MySQL ht ...
- MySQL总结小妙招
mysql5.7版本,免登陆修改管理员密码: vim /etc/my.cnf 加入skip-grant-tables,重启MySQL 终端输入 mysql ,直接登录MySQL数据库,然后use my ...