题目
思路
根据 标签 题意推断出是最小费用最大流问题,最主要的问题是如何构图才能形成网络流的模型
通过读题发现餐巾大致可分为两个部分,一个是新毛巾,要使用的(A类点);一个是旧毛巾,使用过了的(B类点),所以得到:
- 旧毛巾Ai——(inf,f元/条)——>新毛巾Bi+m ( 快洗部 )
- 旧毛巾Ai——(inf,s元/条)——>新毛巾Bi+n ( 慢洗部 )
- 旧毛巾Ai——(inf,0元/条)——>旧毛巾Bi+1 ( 延期送洗 )
*流量为inf,但会受到时间限制
接下来就是源点和汇点之间的连接:
- 每天的新毛巾——(每天需要毛巾数x,0元/条)——>汇点(当流量=x时,表示这一天需要的毛巾够数了)
- 源点——(每天需要毛巾数x,0元/条)——>每天的旧毛巾
- 源点——(购买的毛巾数y,p元/条)——>每天的新毛巾
对应的网络流:
代码
#include <bits/stdc++.h>
#define N 2*n+1
#define maxx 100000
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
struct node
{
int to,next,w,c;
} e[maxx*3];
ll n,cnt=1,p,m,f,nn,s;
int head[maxx],flow[maxx],vis[maxx],last[maxx];
ll dis[maxx];
void add(