BZOJ

洛谷

裸01分数规划。二分之后就是裸最大费用最大流了。

写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样。。

当然用二分也很慢,用什么什么迭代会很快。

[Update] 19.2.15

下午写的zkw费用流在BZOJ上T了= =

然而在洛谷上和以前写的跑的差不多快

当然还可以写整数二分或者KM...

输出的时候最好加个eps,不然可以被卡比如BZOJ discuss里的数据。


第一次写的代码:

  1. //3624kb 4016ms
  2. #include <queue>
  3. #include <cstdio>
  4. #include <cctype>
  5. #include <cstring>
  6. #include <algorithm>
  7. #define gc() getchar()
  8. #define eps 1e-7
  9. #define INF 1e14
  10. const int N=205,M=90000;
  11. int n,src,des,Enum,H[N],to[M],fr[M],nxt[M],cap[M],pre[N];
  12. bool inq[N];
  13. double Ans,dis[N],A[N][N],B[N][N],cost[M];
  14. std::queue<int> q;
  15. inline int read()
  16. {
  17. int now=0;register char c=gc();
  18. for(;!isdigit(c);c=gc());
  19. for(;isdigit(c);now=now*10+c-'0',c=gc());
  20. return now;
  21. }
  22. inline void AddEdge(int u,int v,int w,double c)
  23. {
  24. to[++Enum]=v, nxt[Enum]=H[u], fr[Enum]=u, H[u]=Enum, cap[Enum]=w, cost[Enum]=c;
  25. to[++Enum]=u, nxt[Enum]=H[v], fr[Enum]=v, H[v]=Enum, cap[Enum]=0, cost[Enum]=-c;
  26. }
  27. bool SPFA()
  28. {
  29. for(int i=1; i<=des; ++i) dis[i]=-INF;
  30. q.push(src), dis[src]=0;
  31. while(!q.empty())
  32. {
  33. int x=q.front();q.pop();
  34. inq[x]=0;
  35. for(int v,i=H[x]; i; i=nxt[i])
  36. if(dis[to[i]]<dis[x]+cost[i] && cap[i])
  37. {
  38. dis[v=to[i]]=dis[x]+cost[i], pre[v]=i;
  39. if(!inq[v]) inq[v]=1,q.push(v);
  40. }
  41. }
  42. return dis[des]>-INF;
  43. }
  44. void MCMF(){
  45. for(int i=des; i!=src; i=fr[pre[i]])
  46. --cap[pre[i]], ++cap[pre[i]^1], Ans+=cost[pre[i]];
  47. }
  48. bool pre_Check(double C)
  49. {
  50. for(int i=1; i<=n; ++i)
  51. for(int j=1; j<=n; ++j)
  52. /*if(i!=j) j是女生,不是自己。。*/
  53. AddEdge(i,j+n,1,A[i][j]-C*B[i][j]);
  54. for(int i=1; i<=n; ++i) AddEdge(src,i,1,0),AddEdge(i+n,des,1,0);
  55. Ans=0;
  56. while(SPFA()){
  57. MCMF();
  58. if(Ans<0) break;
  59. }
  60. return Ans>=0;
  61. }
  62. bool Check(double C)
  63. {
  64. int cnt=1;
  65. for(int i=1; i<=n; ++i)
  66. for(int j=1; j<=n; ++j)
  67. cap[++cnt]=1, cost[cnt]=A[i][j]-C*B[i][j], cap[++cnt]=0, cost[cnt]=-A[i][j]+C*B[i][j];
  68. for(int i=1; i<=n; ++i)
  69. cap[++cnt]=1, cost[cnt]=0, cap[++cnt]=0, cost[cnt]=0,
  70. cap[++cnt]=1, cost[cnt]=0, cap[++cnt]=0, cost[cnt]=0;
  71. Ans=0;
  72. while(SPFA()){
  73. MCMF();
  74. if(Ans<0) break;
  75. }
  76. return Ans>=0;
  77. }
  78. int main()
  79. {
  80. n=read(),Enum=1,src=0,des=n<<1|1;
  81. for(int i=1; i<=n; ++i)
  82. for(int j=1; j<=n; ++j) A[i][j]=read();
  83. for(int i=1; i<=n; ++i)
  84. for(int j=1; j<=n; ++j) B[i][j]=read();
  85. double l=0,r=10000.0,mid;
  86. if(pre_Check(mid=(l+r)*0.5)) l=mid;
  87. else r=mid;
  88. while(r>l+eps)
  89. if(Check(mid=(l+r)*0.5)) l=mid;
  90. else r=mid;
  91. printf("%.6lf",l+eps);
  92. return 0;
  93. }

第二次写的代码:(BZOJ上T掉的zkw= =)

  1. #include <queue>
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <cstring>
  5. #include <algorithm>
  6. #define eps 1e-7
  7. #define gc() getchar()
  8. typedef long long LL;
  9. const int N=207,M=(N*N+N)*2;
  10. const double INF=1ll<<61;
  11. int T,Enum,cur[N],H[N],to[M],nxt[M],cap[M],A[103][103],B[103][103];
  12. bool vis[N];
  13. double Cost,cost[M],dis[N];
  14. inline int read()
  15. {
  16. int now=0;register char c=gc();
  17. for(;!isdigit(c);c=gc());
  18. for(;isdigit(c);now=now*10+c-48,c=gc());
  19. return now;
  20. }
  21. inline void AE(int u,int v)
  22. {
  23. to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
  24. to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
  25. }
  26. void PreBuild(int n)
  27. {
  28. Enum=1;
  29. for(int i=1; i<=n; ++i)
  30. for(int j=1; j<=n; ++j) AE(i,j+n);
  31. for(int i=1; i<=n; ++i) AE(0,i), AE(i+n,T);
  32. }
  33. bool BFS()
  34. {
  35. static bool inq[N];
  36. static std::queue<int> q;
  37. for(int i=1; i<=T; ++i) dis[i]=-INF;
  38. q.push(0), dis[0]=0;
  39. while(!q.empty())
  40. {
  41. int x=q.front(); q.pop();
  42. inq[x]=0;
  43. for(int i=H[x],v; i; i=nxt[i])
  44. if(dis[v=to[i]]<dis[x]+cost[i] && cap[i])
  45. dis[v]=dis[x]+cost[i], !inq[v]&&(q.push(v),inq[v]=1);
  46. }
  47. return dis[T]>-INF;
  48. }
  49. bool DFS(int x)
  50. {
  51. if(x==T) return 1;
  52. vis[x]=1;//!!
  53. for(int &i=cur[x]; i; i=nxt[i])
  54. if(!vis[to[i]] && cap[i] && dis[to[i]]==dis[x]+cost[i] && DFS(to[i]))
  55. return --cap[i], ++cap[i^1], Cost+=cost[i], 1;
  56. return 0;
  57. }
  58. bool MCMF()
  59. {
  60. Cost=0;
  61. while(BFS())
  62. {
  63. memset(vis,0,T+1), memcpy(cur,H,T+1<<2);
  64. while(DFS(0) && Cost>=0);
  65. if(Cost<0) break;
  66. }
  67. return Cost>=0;
  68. }
  69. bool Check(int n,double x)
  70. {
  71. int now=1;
  72. for(int i=1; i<=n; ++i)
  73. for(int j=1; j<=n; ++j)
  74. cap[++now]=1, cost[now]=A[i][j]-x*B[i][j], cap[++now]=0, cost[now]=-cost[now-1];
  75. for(int i=1; i<=n; ++i) cap[++now]=1, cap[++now]=0, cap[++now]=1, cap[++now]=0;
  76. return MCMF();
  77. }
  78. int main()
  79. {
  80. freopen("ball.in","r",stdin);
  81. freopen("ball.out","w",stdout);
  82. int n=read(); T=n+n+1;
  83. for(int i=1; i<=n; ++i)
  84. for(int j=1; j<=n; ++j) A[i][j]=read();
  85. for(int i=1; i<=n; ++i)
  86. for(int j=1; j<=n; ++j) B[i][j]=read();
  87. PreBuild(n);
  88. double l=0,r=1e4+1e-4,mid;
  89. while(l+eps<r)
  90. if(Check(n,mid=(l+r)*0.5)) l=mid;
  91. else r=mid;
  92. printf("%.6lf\n",l+eps);
  93. return 0;
  94. }

BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)的更多相关文章

  1. 【BZOJ4819】[Sdoi2017]新生舞会 01分数规划+费用流

    [BZOJ4819][Sdoi2017]新生舞会 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女 ...

  2. P3705 [SDOI2017]新生舞会 01分数规划+费用流

    $ \color{#0066ff}{ 题目描述 }$ 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴. 有\(n\)个男生和\(n\)个女生参加舞会买一个男生和一个女生一 ...

  3. BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流

    BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞 ...

  4. BZOJ-4819: 新生舞会(01分数规划+费用流)

    Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间 ...

  5. [Sdoi2017]新生舞会(分数规划+费用流)

    题解:二分答案mid,然后将每个位置看成a-b*mid,然后由于是n个男生和n个女生匹配,每个人搭配一个cp,于是有点类似于https://www.lydsy.com/JudgeOnline/prob ...

  6. 4819: [Sdoi2017]新生舞会(分数规划)

    4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1031  Solved: 530[Submit][Statu ...

  7. [Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]

    [Sdoi2017]新生舞会 题意:沙茶01分数规划 貌似\(*10^7\)变成整数更科学 #include <iostream> #include <cstdio> #inc ...

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

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1029  Solved: 528[Submit][Status][Discuss] Descripti ...

  9. bzoj 4819: [Sdoi2017]新生舞会【二分+最小费用最大流】

    如果\( b[i]==0 \)那么就是裸的费用流/KM,当然KM快一些但是为什么不写KM呢因为我不会打板子了 考虑二分答案,那么问题变成了判定问题. \[ ans=\frac {a_1+a_2+... ...

随机推荐

  1. vue之props父子组件之间的谈话

    眨眼就来杭州两年了,时间真快. 我们今天来说说vue的一个api---->props 首先我们先看看一个例子,是我一个项目中写的. 看到这个:有木有一点懂了.要是没懂,继续往下看 这里我们用到了 ...

  2. linq.js - LINQ for JavaScript

    var jsonArray = [ { "user": { "id": 100, "screen_name": "d_linq&q ...

  3. Excel VBA保护工作表

    '设定可编辑区域 ActiveSheet.Protection.AllowEditRanges.Add Title:="区域1", Range:=Range("E5:H1 ...

  4. Chrome插件LiveStyle结合Sublime Text3编辑器实现高效可视化开发

    LiveStyle是Chrome中提高开发效率的一款CSS编辑器插件.利用LiveStyle和Sublime Text3编辑器结合可实现可视化开发,一次配置,简单易用! 本文由前端交流QQ群管理员—— ...

  5. [HNOI2013]比赛 (用Hash实现记忆化搜索)

    [HNOI2013]比赛 题目描述 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局, ...

  6. Ettercap之ARP+DNS欺骗

    1.网络攻击拓扑环境 网关:192.168.133.2 攻击者:192.168.133.128 受害者:192.168.133.137 2.原理讲解 ARP欺骗 简介:ARP(Address Reso ...

  7. RabbitMQ消费端消息的获取方式(.Net Core)

    1[短链接]:BasicGet(String queue, Boolean autoAck) 通过request的方式独自去获取消息,断开式,一次次获取,如果返回null,则说明队列中没有消息. 隐患 ...

  8. python3之成像库pillow

    python提供了python image library图像库,处理图像功能,该库提供了广泛的文件格式支持,如JPEG.PNG.GIF.等,它提供了图像档案.图像显示.图像处理等功能 PIL中所涉及 ...

  9. Nagios配置文件nagios.cfg详解

    这里开始要讲一些Nagios的配置. 首先要看看目前Nagios的主配置路径下有哪些文件.[root@nagios etc]# ll总用量 152-rwxrwxr-x. 1 nagios nagios ...

  10. springcloud常见问题处理

    无法在任何已知服务器上执行请求. 原因是注册中心未启动.在使用springcloud搭建微服务时,一定要先启动注册中心,再启动服务端和客户端.具体报错如下: com.netflix.discovery ...