BZOJ 4819:[Sdoi2017]新生舞会 01分数规划+费用流
2018-01-19 15:54
417 查看
题目
若C=(a’1+a’2+…+a’n)/(b’1+b’2+…+b’n)<=mid
则a1−mid∗b1+a2−mid∗b2+...+an−mid∗bn<=0a1−mid∗b1+a2−mid∗b2+...+an−mid∗bn<=0
实数二分,跑最大费用流即可。
不过我自己生成的数据咋T了(TAT
刚知道这玩意原来叫01分数规划
题目分析:
二分答案 mid若C=(a’1+a’2+…+a’n)/(b’1+b’2+…+b’n)<=mid
则a1−mid∗b1+a2−mid∗b2+...+an−mid∗bn<=0a1−mid∗b1+a2−mid∗b2+...+an−mid∗bn<=0
实数二分,跑最大费用流即可。
不过我自己生成的数据咋T了(TAT
刚知道这玩意原来叫01分数规划
#include <cstdio> #include <iostream> #include <cstring> #include <queue> #define il inline using namespace std; const int inf=0x7fffffff; const int maxm=205; const double eps=1e-8; int head[maxm],to[maxm*maxm],cap[maxm*maxm],net[maxm*maxm]; int a[600][600],b[600][600],n; int cnt=1; double min_cost,cost[maxm*maxm],dis[maxm]; il void add(int x,int y,int c,double z){cnt++,to[cnt]=y,cost[cnt]=z,cap[cnt]=c,net[cnt]=head[x],head[x]=cnt;} int flow[maxm],pre[maxm],id[maxm],max_flow; bool vis[maxm]; queue <int> dl; il bool BFS(int s,int t) { while(!dl.empty()) dl.pop(); memset(pre,-1,sizeof(pre)); for(int i=1;i<=t;i++) dis[i]=-inf; dis[s]=0,flow[s]=inf,pre[s]=0,vis[s]=1; dl.push(s); while(!dl.empty()) { int x=dl.front(); dl.pop(); vis[x]=0; for(int i=head[x];i;i=net[i]) { int tmp=to[i]; if(cap[i]>0&&dis[tmp]<dis[x]+cost[i]) { dis[tmp]=dis[x]+cost[i]; pre[tmp]=x; id[tmp]=i; flow[tmp]=min(flow[x],cap[i]); if(!vis[tmp]) vis[tmp]=1,dl.push(tmp); } } } return pre[t]==-1?0:1; } il void change_cap(int s,int t,int x) { int now=t; while(now!=s) { cap[id[now]]-=x,cap[id[now]^1]+=x; now=pre[now]; } } void il get_ans(int s,int t) { max_flow=0,min_cost=0; while(BFS(s,t)) { max_flow+=flow[t],min_cost+=dis[t]*(double)flow[t]; change_cap(s,t,flow[t]); } } il void adx(int x,int y,int cax,double c) { add(x,y,cax,c),add(y,x,0,-c); } il bool check(double mid) { memset(head,0,sizeof(head)); cnt=1; int s=0,t=2*n+1; for(int i=1;i<=n;i++) { adx(s,i,1,0.0),adx(i+n,t,1,0.0); for(int j=1;j<=n;j++) { adx(i,j+n,1,(double)a[i][j]-mid*1.0*b[i][j]); } } get_ans(s,t); return min_cost<=0; } il double work() { double l=0,r=10000; while(r-l>=eps) { double mid=(l+r)/2; if(check(mid)) r=mid; else l=mid; } return l; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&b[i][j]); printf("%.6lf",work()); return 0; }
相关文章推荐
- BZOJ 4819: [Sdoi2017]新生舞会 01分数规划 二分图最大权匹配(KM算法)/费用流
- BZOJ 4819 [Sdoi2017]新生舞会 ——费用流 01分数规划
- BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)
- BZOJ4819 [Sdoi2017]新生舞会 【01分数规划 + 费用流】
- BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流
- [BZOJ4819]-[Sdoi2017]新生舞会-01分数规划+费用流
- [bzoj4819][01分数规划][网络流-费用流]新生舞会
- bzoj4819 [Sdoi2017]新生舞会 01分数规划+二分图最优匹配
- 【bzoj4819】[Sdoi2017]新生舞会 分数规划+费用流
- BZOJ4819: [Sdoi2017]新生舞会(01分数规划)
- bzoj 4819: [Sdoi2017]新生舞会 01分数规划 二分图最优匹配
- 【BZOJ4819】【SDOI2017】新生舞会 [费用流][分数规划]
- [BZOJ4819][SDOI2017]新生舞会(分数规划+费用流,KM)
- bzoj4819 [Sdoi2017]新生舞会 分数规划(实数二分)+网络流检验
- 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)
- 4819: [Sdoi2017]新生舞会(分数规划)
- [BZOJ4819][SDOI2017]新生舞会(二分答案+费用流)
- [Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]
- LOJ 「SDOI2017」新生舞会(二分 + 分数规划+ 费用流)
- loj #2003. 「SDOI2017」新生舞会(分数规划+费用流)