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

Description

a[i][j] ，表示第i个男生和第j个女生一起跳舞时他们的喜悦程度。Cathy还需要考虑两个人一起跳舞是否方便，

athy找到你，希望你帮她写那个程序。一个方案中有n对舞伴，假设没对舞伴的喜悦程度分别是a'1,a'2,...,a'n，

C=(a'1+a'2+...+a'n)/(b'1+b'2+...+b'n),Cathy希望C值最大。

## Input

1<=n<=100,1<=a[i][j],b[i][j]<=10^4

## Sample Input

3 19 17 16 25 24 23 35 36 31 9 5 6 3 4 2 7 8 9

5.357143

## Source

// luogu-judger-enable-o2
#include<cstdio>
#include<queue>
#include<cstring>
#include<cstdlib>
#define INF 1e8+10
using namespace std;
const int MAXN=201;
const double eps=1e-7;
char buf[1<<20],*p1=buf,*p2=buf;
{
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;
}
struct node
{
int u,v,f,nxt;
double w;
}edge[MAXN*MAXN];
int N,S,T;
int a[233][233],b[233][233];
double ans=0.0;
inline void add_edge(int x,int y,int z,double k)
{
edge[num].u=x;
edge[num].v=y;
edge[num].f=z;
edge[num].w=k;
}
inline void AddEdge(int x,int y,int z,double k)
{
}
int arrive[MAXN],vis[MAXN],pre[MAXN];
double dis[MAXN];
bool SPFA()
{
queue<int>q;
q.push(S);
for(register int i=S;i<=T;i++) dis[i]=-1e20,arrive[i]=0;
memset(vis,0,sizeof(vis));
dis[S]=0;vis[S]=1;
while(q.size()!=0)
{
int p=q.front();q.pop();
vis[p]=0;arrive[p]=1;
{
if(edge[i].f&&dis[edge[i].v]<dis[p]+edge[i].w)
{
dis[edge[i].v]=dis[p]+edge[i].w;
pre[edge[i].v]=i;
if(!vis[edge[i].v])
q.push(edge[i].v),vis[edge[i].v]=1;
}
}
}
return arrive[T];
}
int dfs()
{
int mn=INF;
int now=T;
while(pre[now])
{
mn=min(mn,edge[pre[now]].f);
now=edge[pre[now]].u;
}
ans+=mn*dis[T];
now=T;
while(pre[now])
{
edge[pre[now]].f-=mn;
edge[pre[now]^1].f+=mn;
now=edge[pre[now]].u;
}
}
bool check(double val)
{
memset(pre,0,sizeof(pre));
num=2;
ans=0.0;
while(SPFA())
dfs();
if (ans<=0) return 1;
else return 0;
}
int main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
//freopen("c.out","w",stdout);
#else
#endif
S=0,T=N*2|1;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
double l=0,r=10000;
while(r-l>=eps)
{
double mid=(l+r)/2;
if(check(mid)) r=mid;
else l=mid;
}
printf("%.6lf",l);
return 0;
}

1811 篇文章121 人订阅

0 条评论

## 相关文章

### 悬赏题No.1 - 扑克牌

ACM算法日常推出悬赏题啦，悬赏题一般是平时日常听闻的题目，题意简单，结构稍微复杂，并且不知道算法的结果，需要解题者在理解题意的情况下给出合理的解决方案和结果...

9720

35890

523130

10700

### 【量化投资】缠论面面观（附Python源码）

? 来自聚宽：莫邪的救赎的精彩之作 博客连接：https://www.joinquant.com/post/425 因为缠论文章都是博客形式，并无很规范...

1.8K50

12220

9840

30650

13710

9610