[BZOJ1061] [Noi2008] 志愿者招募 (费用流)
Description
Input
Output
仅包含一个整数,表示你所设计的最优方案的总费用。
Sample Input
2 3 4
1 2 2
2 3 5
3 3 2
Sample Output
HINT
1 ≤ N ≤ 1000,1 ≤ M ≤ 10000,题目中其他所涉及的数据均 不超过2^31-1。
Source
Solution
设第$i$种志愿者的人数为$x_{i}$,那么我们有不等式:(以样例说明)
$x_{1}\geq2$
$x_{1}+x_{2}\geq3$
$x_{2}+x_{3}\geq4$
目标为最小化$z=2x_{1}+5x_{2}+2x_{3}$
欸这不是线性规划么,麻麻我不会单纯形
好吧我们用费用流做:
假设我们原来有$INF$个志愿者,然后每一天都会少几个志愿者,需要花钱招募。现要求每一天都有$INF$个志愿者。
然后就按改变后的题意建图:
源点向第一个点连$(INF,0)$的边,之后每一个点向后一个点连$(INF-P[i],0)$的边,第$m+1$个点作为汇点
之后对于每一个志愿者,我们从点$S[i]$到点$T[i]+1$连$(INF,C[i])$的边。
此时最大流必为$INF$,最小费用即为所求答案。
zkw费用流是什么。。。据说费用流不会卡EK算法
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e18;
struct edge
{
int u, v, nxt;
ll w, c;
}e[];
queue<int> Q;
int n, etot = , fst[], fa[];
bool inq[];
ll ans, dis[]; void addedge(int u, int v, ll w, ll c)
{
e[++etot] = (edge){u, v, fst[u], w, c}, fst[u] = etot;
e[++etot] = (edge){v, u, fst[v], , -c}, fst[v] = etot;
} bool SPFA()
{
int u;
memset(dis, , sizeof(dis));
dis[n + ] = , Q.push(n + ), inq[n + ] = true;
while(!Q.empty())
{
u = Q.front(), Q.pop();
for(int i = fst[u]; i; i = e[i].nxt)
if(e[i].w && dis[e[i].v] > dis[u] + e[i].c)
{
dis[e[i].v] = dis[u] + e[i].c;
fa[e[i].v] = i;
if(!inq[e[i].v])
Q.push(e[i].v), inq[e[i].v] = true;
}
inq[u] = false;
}
if(dis[n + ] >= INF) return false;
return true;
} void Edmond_Karp()
{
ll w = INF;
for(int i = fa[n + ]; i; i = fa[e[i].u])
w = min(w, e[i].w);
for(int i = fa[n + ]; i; i = fa[e[i].u])
e[i].w -= w, e[i ^ ].w += w, ans += e[i].c * w;
} int main()
{
int m, u, v;
ll w;
cin >> n >> m;
addedge(n + , , INF, );
for(int i = ; i <= n; ++i)
{
cin >> w;
addedge(i, i + , INF - w, );
}
for(int i = ; i <= m; ++i)
{
cin >> u >> v >> w;
addedge(u, v + , INF, w);
}
while(SPFA())
Edmond_Karp();
cout << ans << endl;
return ;
}
[BZOJ1061] [Noi2008] 志愿者招募 (费用流)的更多相关文章
- BZOJ 1061: [Noi2008]志愿者招募 费用流
1061: [Noi2008]志愿者招募 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1061 Description 申奥成功后,布布 ...
- P3980 [NOI2008]志愿者招募 费用流 (人有多大胆地有多大产
https://www.luogu.org/problemnew/show/P3980 感觉费用流比网络流的图更难想到,要更大胆.首先由于日期是连续的,所以图中的点是横向排列的. 这道题有点绕道走的意 ...
- [NOI2008]志愿者招募 (费用流)
大意: $n$天, 第$i$天要$a_i$个志愿者. $m$种志愿者, 每种无限多, 第$i$种工作时间$[s_i,t_i]$花费$c_i$, 求最少花费. 源点$S$连第一天, 容量$INF$ 第$ ...
- P3980 [NOI2008]志愿者招募 (费用流)
题意:最多1000天 每天需要至少ai个工人施工 有10000种工人可以雇佣 每种工人可以工作si到ti天 雇佣一个的花费是ci 问怎样安排使得施工花费最少 思考:最直白的建模方式 就是每种工人可以和 ...
- Vijos1825 NOI2008 志愿者招募 费用流
Orz ByVoid大神的题解:https://www.byvoid.com/blog/noi-2008-employee/ 学习网络流建图的好题,不难想到线性规划的模型,不过利用模型的特殊性,结合网 ...
- [BZOJ1061][Noi2008]志愿者招募
[BZOJ1061][Noi2008]志愿者招募 试题描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿 ...
- 网络流解线性规划问题 BZOJ1061: [Noi2008]志愿者招募
线性规划定义: 在给定有限的资源和竞争约束情况下,很多问题都可以表述为最大化或最小化某个目标.如果可以把目标指定为某些变量的线性函数,而且如果可以将资源约束指定为这些变量的等式或不等式,则得到了一个线 ...
- 从多种角度看[BZOJ 1061] [NOI 2008]志愿者招募(费用流)
从多种角度看[BZOJ 1061] [NOI 2008]志愿者招募(费用流) 题面 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运 ...
- 【费用流】BZOJ1061: [Noi2008]志愿者招募(这题超好)
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 5291 Solved: 3173[Submit][Stat ...
随机推荐
- Vue站点的搭建之旅
背景 很久没写博客了,这次博客分享一下最近上班空闲时间做的两个业余Demo.分别是V电影App的移动端站点[一直很喜欢用这个APP可是他们没有出对应的mobile端,所以自己开发一个, ...
- Hive metastore整体代码分析及详解
从上一篇对Hive metastore表结构的简要分析中,我再根据数据设计的实体对象,再进行整个代码结构的总结.那么我们先打开metadata的目录,其目录结构: 可以看到,整个hivemeta的目录 ...
- 使用Docker link搭建PHP开发环境
一般我们会把nginx.php都安装在同一个容器,为了扩展方便,我们希望nginx和php分开.那么就可以使用docker link命令实现这一目的. 需要的镜像: nginx 1.12.2 php( ...
- [APIO2015]雅加达的摩天楼
Description 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 " ...
- 使用C#开发C/S框架高级版添加新项目实例
操作步骤: 1.新建一个项目CSFramework3.test,在CSFramework3.test项目下新建一个FormMan窗口(此时不需要继承). 2.按F7打开类,替换一下引用 using S ...
- 1×1卷积的用途(Network in Network)
1×1卷积,又称为Network in Network 如果卷积的输出输入都只是一个平面,那么1x1卷积核并没有什么意义,它是完全不考虑像素与周边其他像素关系. 但卷积的输出输入是长方体,所以1x1卷 ...
- 微博爬虫“免登录”技巧详解及 Java 实现(业余草的博客)
一.微博一定要登录才能抓取? 目前,对于微博的爬虫,大部分是基于模拟微博账号登录的方式实现的,这种方式如果真的运营起来,实际上是一件非常头疼痛苦的事,你可能每天都过得提心吊胆,生怕新浪爸爸把你的那些账 ...
- #pragma预处理命令
#pragma comment(lib,"XXX.lib") 表示链接XXX.lib这个库,和在工程设置里写上XXX.lib的效果一样. #pragma comment(linke ...
- UVA - 1632 Alibaba 区间dp
题意:给定n个点,其中第i个点的坐标是,且它会在秒后消失.Alibaba可以从任意位置出发,求访问完所有点的最短时间.无解输出No solution. 思路:表示访问完区间后停留在i点的最短时间,表示 ...
- 我博客上的围棋js程序
作为一个围棋爱好者,就决定在博客里加个围棋js程序.于是,申请了博客的js权限,美化美化我的博客. 好在js的语法像C系的,看了看,写个程序应该还是可以的. 围棋里,设计好基本的数据结构: //a是1 ...