当前位置: 首页 > news >正文

BZOJ-1497 最大获利

这是道网络流的题

怎么样建图呢?我们从每个人 Ai 连边至其所对应的两个设备 Bi Bj,流量为+∞。

然后新建一对源汇,源连至每个人,流量为满足此人要求的利润;每个设备连至汇,流量为建造设备的代价。

然后求最大流flow,答案就是总利润减去flow。

为什么这种建模可以呢?我们可以通过残留网络来观察。

我们会发现,答案的大小和残留网络中从源点出发的边的可行流量之和一致。

而且每条增广路会经过一条流量是成本的边和流量是利润的边,而且两者的可行流量是同时减小的。这就相当于利润和成本相互抵销。

若存在着一种最大获利的方案,我们就可以通过此方案构造一个残留网络。

所以可以用这种方法求最大获利。

#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#define rep(i, l, r) for(int i=l; i<=r; i++) 
#define down(i, l, r) for(int i=l; i>=r; i--) 
#define clr(x, c) memset(x, c, sizeof(c))
#define travel(x) for(edge *p=d[x]; p; p=p->n) if (p->z)
#define maxv 56789
#define maxm 434567
#define inf 0x7fffffff
using namespace std;
int read()
{
	int x=0; char ch=getchar();
	while (!isdigit(ch)) ch=getchar();
	while (isdigit(ch)) { x=x*10+ch-'0'; ch=getchar(); }
	return x;
}
struct edge{int y, z; edge *n, *pair;} e[maxm], *fir[maxv], *pt, *d[maxv];
inline void Init() {pt=e, clr(fir, 0);}
inline void Add(int x, int y, int z) {pt->y=y, pt->z=z, pt->n=fir[x]; fir[x]=pt++;}
inline void AddE(int x, int y, int z) {Add(x, y, z); Add(y, x, 0); fir[x]->pair=fir[y], fir[y]->pair=fir[x];}
int h[maxv], gap[maxv], S, T, V;

int n, m, ans;

int sap(int now, int flow)
{
	if (now==T) return flow;
	int rec=0, ret;
	travel(now) if (h[p->y]+1==h[now])
	{
		ret=sap(p->y, min(flow-rec, p->z));
		p->z-=ret, p->pair->z+=ret, d[now]=p;
		if ((rec+=ret)==flow) return flow;
	}
	if (!(--gap[h[now]])) h[S]=V;
	++gap[++h[now]]; d[now]=fir[now]; 
	return rec;
}

inline int maxflow()
{
	clr(h, 0), clr(gap, 0); gap[0]=V; rep(i, 1, V) d[i]=fir[i]; 
	int flow=0; while (h[S]<V) flow+=sap(S, inf);
	return flow;
}

int main()
{
	n=read(); m=read(); Init(); S=n+m+1; V=T=n+m+2;
	rep(i, 1, n) AddE(i+m, T, read());
	rep(i, 1, m) {AddE(i, read()+m, inf); AddE(i, read()+m, inf); AddE(S, i, read());}
	for(edge *p=fir[S]; p; p=p->n) ans+=p->z; ans-=maxflow(); printf("%d\n", ans);
	return 0;
}

转载于:https://www.cnblogs.com/NanoApe/p/4442624.html

相关文章:

  • 【原创】如何写一个框架:步骤(上)
  • 深入理解JS执行上下文的点点滴滴
  • MySQL索引原理及慢查询优化,了解一下?
  • [BZOJ 3282] Tree 【LCT】
  • npm script 一见钟情
  • 团队项目之典型用户
  • C++笔记(1)——Anniversary
  • 【第43题】【062题库】2019年OCP认证062考试新题
  • 自我调查 使用输入法
  • linux轻量级监控工具-nmon
  • js基础---变量命名以及运算符
  • JS 原型、原型继承、原型链的理解
  • Linux 双网卡绑定
  • Docker 的基本概念和框架
  • css书写规范
  • Java 最常见的 200+ 面试题:面试必备
  • JS笔记四:作用域、变量(函数)提升
  • Nodejs和JavaWeb协助开发
  • Vue UI框架库开发介绍
  • Yii源码解读-服务定位器(Service Locator)
  • zookeeper系列(七)实战分布式命名服务
  • 讲清楚之javascript作用域
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 全栈开发——Linux
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 学习HTTP相关知识笔记
  • 字符串匹配基础上
  • HanLP分词命名实体提取详解
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • #{} 和 ${}区别
  • (2)nginx 安装、启停
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (函数)颠倒字符串顺序(C语言)
  • (推荐)叮当——中文语音对话机器人
  • (万字长文)Spring的核心知识尽揽其中
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .NET Framework 服务实现监控可观测性最佳实践
  • ??myeclipse+tomcat
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @在php中起什么作用?
  • [AIGC codze] Kafka 的 rebalance 机制
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [BZOJ2208][Jsoi2010]连通数
  • [C++][基础]1_变量、常量和基本类型
  • [C++]类和对象【下】
  • [echarts] y轴不显示0
  • [HDU3710]Battle over Cities
  • [Java并发编程实战] 共享对象之可见性
  • [Kubernetes]9. K8s ingress讲解借助ingress配置http,https访问k8s集群应用
  • [LeetBook]【学习日记】数组内乘积