[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 ...
随机推荐
- PHP curl 常用操作
网页内容替换 $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, "http://www.baidu.com"); //执行后 ...
- MySQL创建用户与授权
一. 创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用户名 host:指定该用户 ...
- Hive入门教程
Hive 安装 相比起很多教程先介绍概念,我喜欢先动手装上,然后用例子来介绍概念.我们先来安装一下Hive 先确认是否已经安装了对应的yum源,如果没有照这个教程里面写的安装cdh的yum源http: ...
- Java经典编程题50道之三十七
有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位. public class Example37 { public static v ...
- C/C++语言简介之语言组成
一.数据类型 C的数据类型包括:整型.字符型.实型或浮点型(单精度和双精度).枚举类型.数组类型.结构体类型.共用体类型.指针类型和空类型. 二.常量与变量 常量其值不可改变,符号常量名通常用大写. ...
- bzoj2151 种树 双向链表+堆
2151: 种树 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1151 Solved: 613[Submit][Status][Discuss] ...
- HDU 5060
题意略. 这个题目最关键的是在于计算球冠的体积.令球冠体积为V. 我们可以用祖暅原理来计算V, 这里,可以看出,球冠的体积等于左图的上半个圆柱减去那个倒扣的圆台. 祖暅原理:界于两个平行平面之间的两个 ...
- Android查缺补漏(IPC篇)-- 进程间通讯之Socket简介及示例
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8425736.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
- bootstrap模态对话框
bootstrap模态对话框 前提是引入bootstrap的css和js的东西 data-backdrop="static"代表的是点击旁边的内容,不进行关闭操作,但是esc的时候 ...
- 01-python中字符串的常见操作
(1)find 检测str是否包含在myStr中,如果存在则返回开始的索引值,否则返回-1. In [1]: myStr = "hello world tairan and tairanCi ...