3442: 学习小组

题目:传送门


题解:

   超级好题啊大佬们的神题!建图肥肠灵性!感觉自己是星际玩家。。。

   首先呢st直接向每个人连边,容量为min(k,喜欢的小组个数),费用为0

   然后每个人再向ed连,因为题目要求人数尽量多,那么每个人都至少要去一个学习小组,那么容量就为min(k-1,喜欢的小组个数-1),费用为0(表示每个人最多能不选的小组)

   每个人还要向自己喜欢的小组连边,容量为1,费用就为-F[i](因为题目问的是最小的支出,那么F表示的是手续费,所以肯定为负)

   灵性的操作来了:

   每个小组当然是还要向ed连的。

   直接就把每个小组向ed连n条边,表示不同人数参加该小组时的花费

   容量为1,流量就要推导一下:

   对于有i-1个人参加了该小组j,那么多一个人的费用差就是:C[j]*i^2-C[j]*(i-1)^2

   化简之后就是:C[j]*(2*i-1);

  


代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<cmath>
  5. #include<algorithm>
  6. #define inf 999999999
  7. using namespace std;
  8. struct node
  9. {
  10. int x,y,c,d,next,other;
  11. }a[];int len,last[];
  12. void ins(int x,int y,int c,int d)
  13. {
  14. int k1,k2;
  15. k1=++len;
  16. a[len].x=x;a[len].y=y;a[len].c=c;a[len].d=d;
  17. a[len].next=last[x];last[x]=len;
  18.  
  19. k2=++len;
  20. a[len].x=y;a[len].y=x;a[len].c=;a[len].d=-d;
  21. a[len].next=last[y];last[y]=len;
  22.  
  23. a[k1].other=k2;
  24. a[k2].other=k1;
  25. }
  26. int list[],d[],la[],head,tail,st,ed,n,m,k,ans;
  27. bool v[];
  28. bool spfa()
  29. {
  30. for(int i=;i<=ed;i++)d[i]=inf;
  31. memset(v,false,sizeof(v));memset(la,,sizeof(la));
  32. list[]=st;d[st]=;v[st]=true;head=;tail=;
  33. while(head!=tail)
  34. {
  35. int x=list[head];
  36. for(int k=last[x];k;k=a[k].next)
  37. {
  38. int y=a[k].y;
  39. if(a[k].c> && d[y]>d[x]+a[k].d)
  40. {
  41. d[y]=d[x]+a[k].d;la[y]=k;
  42. if(v[y]==false)
  43. {
  44. v[y]=true;
  45. list[tail++]=y;
  46. if(tail==ed+)tail=;
  47. }
  48. }
  49. }
  50. head++;if(head==ed+)head=;
  51. v[x]=false;
  52. }
  53. if(d[ed]==inf)return false;
  54. return true;
  55. }
  56. int g_f()
  57. {
  58. int x,k,ans=,f=inf;
  59. x=ed;while(x!=st){k=la[x];f=min(f,a[k].c);x=a[k].x;}
  60. x=ed;while(x!=st){k=la[x];a[k].c-=f;a[a[k].other].c+=f;x=a[k].x;}
  61. ans+=d[ed]*f;
  62. return ans;
  63. }
  64. int C[],F[],tot[];
  65. char s[];
  66. int main()
  67. {
  68. scanf("%d%d%d",&n,&m,&k);len=;memset(last,,sizeof(last));st=n+m+,ed=st+;
  69. for(int i=;i<=m;i++)scanf("%d",&C[i]);for(int i=;i<=m;i++)scanf("%d",&F[i]);
  70. for(int i=;i<=n;i++)
  71. {
  72. scanf("%s",s+);
  73. for(int j=;j<=m;j++)if(s[j]=='')ins(i,j+n,,-F[j]),tot[i]++;
  74. }
  75. for(int i=;i<=n;i++)ins(st,i,min(k,tot[i]),),ins(i,ed,min(k-,tot[i]-),);
  76. //C[j]*i^2-C[j]*(i-1)^2-->C[j]*(2*i-1)
  77. for(int j=;j<=m;j++)for(int i=;i<=n;i++)ins(j+n,ed,,C[j]*(*i-));
  78. ans=;while(spfa())ans+=g_f();printf("%d\n",ans);
  79. return ;
  80. }

bzoj3442: 学习小组(费用流好题)的更多相关文章

  1. 【BZOJ3442】学习小组 费用流

    [BZOJ3442]学习小组 Description [背景] 坑校准备鼓励学生参加学习小组. [描述] 共有n个学生,m个学习小组,每个学生有一定的喜好,只愿意参加其中的一些学习小组,但是校领导为学 ...

  2. BZOJ3442: 学习小组

    Description [背景] 坑校准备鼓励学生参加学习小组. [描述]     共有n个学生,m个学习小组,每个学生有一定的喜好,只愿意参加其中的一些学习小组,但是校领导为学生考虑,规定一个学生最 ...

  3. bzoj3442学习小组

    bzoj3442学习小组 题意: 共有n个学生,m个学习小组,每个学生只愿意参加其中的一些学习小组,且一个学生最多参加k个学习小组.每个学生参加学习小组财务处都收一定的手续费,不同的学习小组有不同的手 ...

  4. HDU 3376 &amp;&amp; 2686 方格取数 最大和 费用流裸题

    题意: 1.一个人从[1,1] ->[n,n] ->[1,1] 2.仅仅能走最短路 3.走过的点不能再走 问最大和. 对每一个点拆点限流为1就可以满足3. 费用流流量为2满足1 最大费用流 ...

  5. Lunch Time(费用流变型题,以时间为费用)

    Lunch Time http://acm.hdu.edu.cn/showproblem.php?pid=4807 Time Limit: 4000/2000 MS (Java/Others)     ...

  6. Coding Contest(费用流变形题,double)

    Coding Contest http://acm.hdu.edu.cn/showproblem.php?pid=5988 Time Limit: 2000/1000 MS (Java/Others) ...

  7. Going Home POJ - 2195 费用流板子题

    On a grid map there are n little men and n houses. In each unit time, every little man can move one ...

  8. POJ 3686 The Windy's(思维+费用流好题)

    The Windy's Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5362   Accepted: 2249 Descr ...

  9. CFGYM 2013-2014 CT S01E03 D题 费用流模版题

    题意: n行, a房间的气球,b房间的气球 i行需要的气球,与a房的距离,b房的距离 求最小距离 #include <stdio.h> #include <string.h> ...

随机推荐

  1. ubuntu14.04无法安装Curl

    ubuntu14.04无法安装Curl apt-get install curl 提示没有这个软件 源 更换软件源到163也不行,更新软件源也不行. 解决:參考http://www.linuxidc. ...

  2. Oracle 优化和性能调整

    分析评价Oracle数据库性能主要有数据库吞吐量.数据库用户响应时间两项指标.数据库用户响应时间又可以分为系统服务时间和用户等待时间两项,即:  数据库用户响应时间=系统服务时间+用户等待时间  因此 ...

  3. isual Studio 2013编译ImageMagick---转

    “该文引用自 CruiseYoung的:Visual Studio 2013编译ImageMagick http://blog.csdn.net/fksec/article/details/36008 ...

  4. 杂项-编程:AOP(面向切面编程)

    ylbtech-杂项-编程:AOP(面向切面编程) 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一 ...

  5. Centos6.5添加Epel和Remi源安装Lamp环境

    想搭建一个Lamp环境,因为编译安装太麻烦,对于我这样的新手来说,太过于复杂.而CentOS自带的Apache.MySql和PHP的版本都太低,不想用.上百度搜了一轮,原来可以通过添加Epel和Rem ...

  6. Hybrid混合开发中schema协议的使用与封装

    混合开发中JS与APP通信的实现原理: JS通过schema协议,传递参数和全局回调函数给APP端 APP执行完(如微信扫一扫)后,调用协议中传入的回调函数,在前端执行回调处理. 默认写法: < ...

  7. Android设计模式—— 观察者模式(以及EventBus的简单使用)

    1.概述 观察者模式最常用的地方是GUI系统.订阅-发布系统.观察者模式的一个重要作用就是解耦,将观察者和被观察者解耦,使得他们之间的依赖性更小. 2.定义 定义对象间的一种一对多依赖关系,使得每当一 ...

  8. Python写99乘法表

    #!/usr/bin/python# -*- encoding:utf-8 -*- for i in range(1,10):    s=''    for j in range(1,i+1):    ...

  9. GRpc-Proto3语法

        syntax = "proto3"; 文件的第一行指定了你使用的是proto3的语法:如果你不指定,protocol buffer 编译器就会认为你使用的是proto2的语 ...

  10. linux 下vim中关于删除某段,某行,或者全部删除的命令