【BZOJ 3442】 3442: 学习小组 (最大费用流)
3442: 学习小组
Time Limit: 5 Sec Memory Limit: 128 MB
Submit: 403 Solved: 193Description
【背景】坑校准备鼓励学生参加学习小组。【描述】共有n个学生,m个学习小组,每个学生有一定的喜好,只愿意参加其中的一些学习小组,但是校领导为学生考虑,规定一个学生最多参加k个学习小组。财务处的大叔就没那么好了,他想尽量多收钱,因为每个学生参加学习小组都要交一定的手续费,不同的学习小组有不同的手续费。然而,事与愿违,校领导又决定对学习小组组织者进行奖励,若有a个学生参加第i个学习小组,那么给这个学习小组组织者奖励Ci*a^2元。在参与学生(而不是每个学习小组的人数总和)尽量多的情况下,求财务处最少要支出多少钱(若为负数,则输出负数)(支出=总奖励费-总手续费)。Input
输入有若干行,第一行有三个用空格隔开的正整数n、m、k。接下来的一行有m个正整数,表示每个Ci。第三行有m个正整数,表示参加每个学习小组需要交的手续费Fi。再接下来有一个n行m列的矩阵,表若第i行j列的数字是1,则表示第i个学生愿意参加第j个学习小组,若为0,则为不愿意。Output
输出只有一个整数,为最小的支出。Sample Input
3 3 1
1 2 3
3 2 1
111
111
111Sample Output
-2
【样例解释】
参与学生最多为3,每个学生参加一个学习小组,若有两个学生参加第一个学习小组,一个学生参加第二个学习小组(一定要有人参加第二个学习小组),支出为-2,可以证明没有更优的方案了。
【数据范围与约定】
100%的数据,0<n≤100,0<m≤90,0<k≤m,0<Ci≤10,0<Fi≤100。HINT
Source
【分析】
今天有点傻,不想打题解了。。自己看吧。。。
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #include<queue>
- using namespace std;
- #define Maxn 110
- #define INF 0x7fffffff
- int mymin(int x,int y) {return x<y?x:y;}
- int c[Maxn];
- struct node
- {
- int x,y,f,c,o,next;
- }t[Maxn*Maxn*];
- int len,first[Maxn*];
- void ins(int x,int y,int f,int c)
- {
- // swap(x,y);
- t[++len].x=x;t[len].y=y;t[len].f=f;t[len].c=c;
- t[len].next=first[x];first[x]=len;t[len].o=len+;
- t[++len].x=y;t[len].y=x;t[len].f=;t[len].c=-c;
- t[len].next=first[y];first[y]=len;t[len].o=len-;
- }
- queue<int > q;
- int st,ed;
- int flow[Maxn*],pre[Maxn*],dis[Maxn*];
- bool inq[Maxn*];
- bool bfs()
- {
- while(!q.empty()) q.pop();
- for(int i=;i<=ed;i++) dis[i]=INF;
- memset(inq,,sizeof(inq));
- flow[st]=INF;q.push(st);dis[st]=;
- inq[st]=;
- while(!q.empty())
- {
- int x=q.front();
- for(int i=first[x];i;i=t[i].next) if(t[i].f>)
- {
- int y=t[i].y;
- if(dis[y]>dis[x]+t[i].c)
- {
- dis[y]=dis[x]+t[i].c;
- pre[y]=i;
- flow[y]=mymin(flow[x],t[i].f);
- if(!inq[y])
- {
- q.push(y);
- inq[y]=;
- }
- }
- }
- q.pop();inq[x]=;
- }
- if(dis[ed]==INF) return ;
- return ;
- }
- int sum=;
- int max_flow()
- {
- while(bfs())
- {
- int x=ed;
- sum+=flow[ed]*dis[ed];
- int a=flow[ed];
- while(x!=st)
- {
- t[pre[x]].f-=a;
- t[t[pre[x]].o].f+=a;
- x=t[pre[x]].x;
- }
- }
- }
- void output()
- {
- for(int i=;i<=len;i+=)
- printf("%d -> %d %d %d\n",t[i].x,t[i].y,t[i].f,t[i].c);
- }
- char s[Maxn];
- int main()
- {
- int n,m,k;
- scanf("%d%d%d",&n,&m,&k);
- st=n+m+;ed=st+;
- for(int i=;i<=m;i++)
- {
- int cc;
- scanf("%d",&cc);
- for(int j=;j<=n;j++)
- {
- ins(st,i,,cc*(*j-));
- }
- }
- for(int i=;i<=m;i++) scanf("%d",&c[i]);
- for(int i=;i<=n;i++) ins(st,i+m,k-,);
- for(int i=;i<=n;i++)
- {
- scanf("%s",s+);
- for(int j=;j<=m;j++)
- {
- if(s[j]=='') ins(j,m+i,,-c[j]);
- }
- }
- for(int i=;i<=n;i++) ins(m+i,ed,k,);
- // output();
- // swap(st,ed);
- sum=;max_flow();
- printf("%d\n",sum);
- return ;
- }
2017-04-07 16:26:33
【BZOJ 3442】 3442: 学习小组 (最大费用流)的更多相关文章
- bzoj3442: 学习小组(费用流好题)
3442: 学习小组 题目:传送门 题解: 超级好题啊大佬们的神题!建图肥肠灵性!感觉自己是星际玩家... 首先呢st直接向每个人连边,容量为min(k,喜欢的小组个数),费用为0 然后每个人再向ed ...
- BZOJ 3876 支线剧情 | 有下界费用流
BZOJ 3876 支线剧情 | 有下界费用流 题意 这题题面搞得我看了半天没看懂--是这样的,原题中的"剧情"指的是边,"剧情点"指的才是点. 题面翻译过来大 ...
- 从多种角度看[BZOJ 1061] [NOI 2008]志愿者招募(费用流)
从多种角度看[BZOJ 1061] [NOI 2008]志愿者招募(费用流) 题面 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运 ...
- 【BZOJ】【3442】学习小组
网络流/费用流 orz zyf 裸的费用流,根据题目描述即可建出如下的图: S->i 费用表示每有一个加入第 i 个小组的学生,需要花的钱,由于是跟流量(人数)的二次方相关,所以要拆边……然后每 ...
- [BZOJ 1221] [HNOI2001] 软件开发 【费用流 || 三分】
题目链接:BZOJ - 1221 题目分析 算法一:最小费用最大流 首先这是一道经典的网络流问题.每天建立两个节点,一个 i 表示使用毛巾,一个 i' 表示这天用过的毛巾. 然后 i 向 T 连 Ai ...
- BZOJ 1877 晨跑 拆点费用流
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1877 题目大意: Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧 ...
- 学习了ZKW费用流
所谓ZKW费用流,其实就是Dinic. 若干年前有一个人发明了最小增广路算法,每次用BFS找一条增广路,时间O(nm^2) 然后被DinicD飞了:我们为什么不可以在长度不变时多路增广呢?时间O(n^ ...
- BZOJ 1877: [SDOI2009]晨跑(费用流)
看到要求两个量就下意识的想到了费用流= =,先把一个点拆成两个点就能够解决一个的只经过一次的限制 CODE: #include<cstdio>#include<iostream> ...
- bzoj 2324 ZJOI 营救皮卡丘 费用流
题的大概意思就是给定一个无向图,边有权值,现在你有k个人在0点,要求走到n点,且满足 1:人们可以分头行动,可以停在某一点不走了 2:当你走到x时,前x-1个点必须全部走过(不同的人走过也行,即分两路 ...
- BZOJ 2245 SDOI 2011 工作安排 费用流
题目大意:有一些商品须要被制造.有一些员工.每个员工会做一些物品,然而这些员工做物品越多,他们的愤慨值越大,这满足一个分段函数.给出哪些员工能够做哪些东西,给出这些分段函数,求最小的愤慨值以满足须要被 ...
随机推荐
- H5多媒体
Video <video width="500px" controls="controls"> <source src="test. ...
- thinkphp表单验证
之前的表单验证都是用js写的,这里也可以使用tp框架的验证.但是两者比较而言还是js验证比较好,因为tp框架验证会运行后台代码,这样运行速度和效率就会下降. 自动验证是ThinkPHP模型层提供的一种 ...
- Python自定义web框架、Jinja2
WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app与web server之间接口格式,实现web app与web server ...
- spring boot 加载原理
spring boot quick start 在springBoot里面,很吸引的一个特征就是可以直接把应用打包成jar/war包形式.然后jar/war包可以直接运行的.不需要再配置web Ser ...
- 38 - 网络编程-socketserver
目录 1 socket编程弊端 2 SocketServer模块 2.1 服务器类 2.2 Mixin类 2.3 RequestHandlerClass是啥 2.4 编程接口 3 实现EchoServ ...
- 高通msm mdm 总结
1. svn 获取工程代码命令:svn co svn+ssh://10.20.30.18/svn-repos/msm8916/branches/LA1.1-CS-r113502.2 2. 如何确定那些 ...
- slave->pxc后GTID不一致
以下两个参数在两个节点是对得上的. | wsrep_last_applied | 3363764 | | wsrep_last_committed | 3363764 但show master sta ...
- 在Ubuntu上安装搜狗输入法
1.进入搜狗输入法官网 2.下载Linux版本,选择64bit 下载 3.等待下载的同时,进行系统配置 进入系统设置->语言支持->进行更新(需要输入登录密码)->在键盘输入法系统选 ...
- 报错:/application/zabbix/sbin/zabbix_server: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
启动zabbix_server时报错: /application/zabbix/sbin/zabbix_server: error while loading shared libraries: li ...
- [HTML]增加input标签的multiple属性上传的文件数
.发现问题 <input type="file" name="myfile[]" multiple="multiple"/> 最 ...