[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 ...
随机推荐
- 深入cocos2d-x中的touch事件
深入cocos2d-x中的touch事件 在文章cocos2d-x中处理touch事件中简单讨论过怎样处理touch事件, 那么今天来深入了解下cocos2d-x中是怎样分发touch事件的. 我们最 ...
- linux下卸载已安装的软件
1.先查询该软件是否安装,是否存在 rpm -qa | grep -i teamview 2.根据一中的结果(软件包名称),执行如下命令 rpm -e [软件包名]
- win10+anaconda+cuda配置dlib,使用GPU对dlib的深度学习算法进行加速(以人脸检测为例)
在计算机视觉和机器学习方向有一个特别好用但是比较低调的库,也就是dlib,与opencv相比其包含了很多最新的算法,尤其是深度学习方面的,因此很有必要学习一下.恰好最近换了一台笔记本,内含一块GTX1 ...
- MySQL体系结构及多实例
MySQL客户端和服务器端模型 MySQL是一个典型C/S,服务器端与客户端两部分组成 服务器端程序 mysqld mysql自带的客户端(mysql mysqladmin mysqldump等) ...
- Python print 输出到控制台 丢数据
import xlrd import sys,time data = xlrd.open_workbook("C:\Users\Administrator\Desktop\\new1.xls ...
- CentOS7上安装并配置Nginx、PHP、MySql
一.Nginx 1.安装nginx yum install nginx 2.启动nginx systemctl start nginx 除了systemctl start nginx之外,常用的相关命 ...
- CodeForces - 796B 模拟
思路:模拟移动即可,如果球落入洞中停止移动.注意:有可能第一个位置就是洞!! AC代码 #include <cstdio> #include <cmath> #include ...
- MySQL InnoDB表压缩
MySQL InnoDB表压缩 文件大小减小(可达50%以上) ==> 查询速度变快(count * 约减少20%以上时间) 如何设置mysql innodb 表的压缩: 第一,mysql的版本 ...
- 特殊权限SUIG、SGID、SBIT
一.SetUID与SGID 只能用于二进制程序 执行者需要有该二进制程序的x权限 执行具有SUID权限的二进制程序,那么执行者将具有该二进制程序所有者的权限. 举例来说,/etc/passwd文件的权 ...
- SQL Server 批量插入
使用场景 在项目中,涉及到数据库表变更时,可能会需要将一个或多个表中的数据迁移到另一个表中. 这时用sql去执行会很方便! sql语句 //SQL批量插入 create table #ttableNa ...