bzoj3442学习小组

题意:

共有n个学生,m个学习小组,每个学生只愿意参加其中的一些学习小组,且一个学生最多参加k个学习小组。每个学生参加学习小组财务处都收一定的手续费,不同的学习小组有不同的手续费。若有a个学生参加第i个学习小组,财务处支付奖励Ci*a^2元。在参与学生(而不是每个学习小组的人数总和)尽量多的情况下,求财务处最少要支出多少钱。

题解:

s连n个学生,流量为k,费用为0。每个学生向喜欢的小组的连边,流量为1,费用为手续费的相反数。每个小组向t连边,它的费用与流量的平方成正比的边,需要把它拆成k条流量为1,费用为1*ci、3*ci…(2*k-1)的边。本题的难点是要参与学生尽量多,所以我们需要每个学生至少参加一个组,因此每个学生再向t连一条流量为k-1,费用为0的边,就可以了。

代码:

 #include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define inc(i,j,k) for(int i=j;i<=k;i++)
#define visit(i,j) for(int i=g[j];i!=-1;i=es[i].n)
#define INF 0x3fffffff
using namespace std; struct e{int f,t,c,w,n;}; e es[]; int ess,g[];
void pe(int f,int t,int c,int w){
es[++ess]=(e){f,t,c,w,g[f]}; g[f]=ess; es[++ess]=(e){t,f,,-w,g[t]}; g[t]=ess;
}
void init(){ess=-; memset(g,-,sizeof(g));}
int d[],fr[]; queue <int> q; bool inq[],vis[];
bool spfa(int s,int t){
while(! q.empty())q.pop(); memset(inq,,sizeof(inq)); memset(vis,,sizeof(vis));
inq[s]=; d[s]=; vis[s]=; q.push(s);
while(! q.empty()){
int x=q.front(); q.pop(); inq[x]=;
visit(i,x)if(es[i].c&&(! vis[es[i].t]||d[es[i].t]>d[x]+es[i].w)){
d[es[i].t]=d[x]+es[i].w; vis[es[i].t]=; fr[es[i].t]=i;
if(! inq[es[i].t])inq[es[i].t]=,q.push(es[i].t);
}
}
if(! vis[t])return ;else return ;
}
int advanced(int s,int t){
int a=INF; for(int i=t;i!=s;i=es[fr[i]].f)a=min(a,es[fr[i]].c);
int cost=; for(int i=t;i!=s;i=es[fr[i]].f)es[fr[i]].c-=a,es[fr[i]^].c+=a,cost+=(es[fr[i]].w*a);
return cost;
}
int maxflowmincost(int s,int t){
int cost=; while(spfa(s,t))
cost+=advanced(s,t); return cost;
}
int n,m,k,s,t,a1[]; char a3[];
int main(){
//freopen("test.txt","r",stdin);
scanf("%d%d%d",&n,&m,&k); s=; t=n+m+; init(); inc(i,,n)pe(s,i,k,),pe(i,t,k-,);
inc(i,n+,n+m){int a2; scanf("%d",&a2); inc(j,,n)pe(i,t,,(j*-)*a2);}
inc(i,,m)scanf("%d",&a1[i]); inc(i,,n){
scanf("%s",a3); inc(j,,m){if(a3[j-]=='')pe(i,n+j,,-a1[j]);}
}
printf("%d",maxflowmincost(s,t));
return ;
}

20160418

最新文章

  1. 【UWP开源】图片编辑器,带贴图、滤镜、涂鸦等功能
  2. C++中重定义的问题——问题的实质是声明和定义的关系以及分离式编译的原理
  3. Appium+Robotframework实现Android应用的自动化测试-4:AppiumLibrary介绍和安装
  4. RTP-RTCP-RTSP协议的区别与联系
  5. 关于app上页面和js的调试
  6. Android sqlite 数据库在java代码中的增删改查
  7. cf B. Simple Molecules
  8. Java路径问题最终解决方案—可定位所有资源的相对路径寻址
  9. 关于tag,viewWithTag
  10. XJOI1689相连的城市
  11. Docker入门之---ENTRYPOINT和CMD
  12. bzoj 4545: DQS的trie
  13. python3全栈开发-多进程的守护进程、进程同步、生产者消费者模式(重点)
  14. 什么是pyc文件,Python
  15. CF 634A Island Puzzle
  16. 【BZOJ1876】[SDOI2009]SuperGCD(数论,高精度)
  17. IntelliJ IDEA AndroidStudio SVN无法使用
  18. [转载]Oracle修改用户表所属表空间的步骤
  19. 2019-03-11-day008-函数帮助
  20. es6新特性之箭头函数

热门文章

  1. Mysql:bit类型的查询与插入
  2. Linux切换超级管理员root用户
  3. MFC vc++严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C3646 “m_SockClient”: 未知重写说明符
  4. 浅析pplx库的设计与实现。
  5. Redis进阶之使用Lua脚本自定义Redis命令
  6. java map里面进行ASCII 码从小到大排序(字典序)
  7. 一对多分页的SQL到底应该怎么写?
  8. LIMS产品 - Labware
  9. egret.sys.TextNode
  10. webpack入门进阶(1)