qwq神仙题啊

这个题有好几个建图的方式,这里只介绍其中一种

里面掺杂了个人理解,要是有不对的地方还望指出。

首先,我们将保留一个物品看成是卖出再买进。然后我们令每次都强制买进一个物品,那么如果保留一个物品,我们就看成是在当前天的前一天卖出,然后当前天再买入。

那么这样就能得出一个靠谱的建图

首先我们对于第iii天,建边s−>is->is−>i流量是1,费用是w[a[i]]w[a[i]]w[a[i]]的边,表示每天都强制买入,然后我们新建一排点,表示一个中转点,就是当前天的物品是卖还是不卖,建边i−>i+ni->i+ni−>i+n;流量是1,费用是0,表示这个物品不卖,也就是不保留,直接扔掉。

然后i+n−>ti+n->ti+n−>t流量是1,表示一个物品只能卖一次。
i−>i+1i->i+1i−>i+1流量是k−1k-1k−1表示每一天可以留到下一天k−1k-1k−1本书。

如果对于一个物品,我们选择保留的话,就相当于卖出再买入,但是由于保留了,所以上一次这本书到这一次之前一天的其他书籍的数量要减一。

所以我们i−1−>pos[a[i]]i-1 - > pos[a[i]]i−1−>pos[a[i]] 流量是1,费用是−w[a[i]]-w[a[i]]−w[a[i]]

表示保留这个东西

然后直接最小费用流就ok
qwq其实还是挺神仙,代码里面也有讲解的。
qwq

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define mk make_pair
#define ll long long
using namespace std;
inline int read()
{int x=0,f=1;char ch=getchar();while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}
const int maxn = 510;
const int maxm = 2e6+1E2;
const int inf = 1e9;
int point[maxn],nxt[maxm],to[maxm];
int flow[maxm],pre[maxm],cost[maxm];
int from[maxn],vis[maxn],dis[maxn];
int cnt=1,n,m;
int pos[2000100];
int a[maxn],w[maxn];
int ans;
int s,t;
void addedge(int x,int y,int w,int f)
{nxt[++cnt]=point[x];to[cnt]=y;pre[cnt]=x;cost[cnt]=w;flow[cnt]=f;point[x]=cnt;
}
void insert(int x,int y,int w,int f)
{addedge(x,y,w,f);addedge(y,x,-w,0);
}
queue<int> q;
bool spfa(int s)
{memset(vis,0,sizeof(vis));memset(dis,127/3,sizeof(dis));dis[s]=0;q.push(s);while (!q.empty()){int x=q.front();q.pop();vis[x]=0;for (int i=point[x];i;i=nxt[i]){int p = to[i];if (flow[i]>0 && dis[p]>dis[x]+cost[i]){dis[p]=dis[x]+cost[i];from[p]=i;if(!vis[p]){q.push(p);vis[p]=1;}}}}//cout<<"***"<<endl;if (dis[t]>=dis[maxn-3]) return 0;else return 1;
}
void mcf()
{int x = inf;for (int i=from[t];i;i=from[pre[i]]){x = min(x,flow[i]);}for (int i=from[t];i;i=from[pre[i]]){flow[i]-=x;flow[i^1]+=x;ans+=x*cost[i];}
}
void solve()
{while(spfa(s))mcf();
}
int k;
int main()
{n=read(),k=read();for (int i=1;i<=n;i++) a[i]=read();for (int i=1;i<=n;i++) w[i]=read();s=maxn-10;t=s+1;for (int i=1;i<=n;i++){insert(s,i,w[a[i]],1); insert(i,i+n,0,1); //这个边表示买下这个东西 然后立刻扔掉 insert(i+n,t,0,1); if (pos[a[i]]) insert(i-1,pos[a[i]]+n,-w[a[i]],1);//表示把上次购买的这个物品留到现在,然后这一段之间的留下的书的数量减一(因为从S流到pos[a[i]]的边会流下来占据一个流量) pos[a[i]]=i;}for (int i=1;i<n;i++) insert(i,i+1,0,k-1);solve();cout<<ans;return 0;
}

CF802C Heidi and Library (hard) (网络流+最大流)相关推荐

  1. POJ - 3614 Sunscreen(贪心/二分图最大匹配-多重匹配/网络流-最大流)

    题目链接:点击查看 题目大意:给出n头奶牛,奶牛们现在要晒太阳,每头奶牛需要[l,r]区间内的光照强度,现在有m种防晒霜,每种防晒霜可以让奶牛接受到val数值的光照强度,然后每种防晒霜只有num个,现 ...

  2. 【bzoj1532】[POI2005]Kos-Dicing 二分+网络流最大流

    题目描述 Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一个俱乐部. 俱乐部的人时常在一起玩这个游戏然后评选出玩得最好的人.现在有一个非常不走运的 ...

  3. 【图论】网络流——最大流和最小费用流

    [图论]网络流--最大流和最小费用流 文章目录 [图论]网络流--最大流和最小费用流 1. 最大流问题 1.1 基本概念 1.2 寻求最大流的算法(Ford-Fulerson) 1.3 matlab求 ...

  4. 网络流最大流初步-Push–relabel maximum flow algorithm

    简介 做网络流最大流的题,常用的算法就是Dinic's algorithm.时间复杂度为,通常由于出题人水平较低,几乎能过所有的题.功利地看,这样就没问题了.但是,站在追求真(zhuang)理(B)的 ...

  5. (通俗易懂小白入门)网络流最大流——EK算法

    网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定 ...

  6. 网络流——最大流EK算法讲解

    网络流--最大流EK算法讲解 好了,这是第二篇博客了,如第一篇所述,来讲一讲刚刚理解的网络流.因为本人只会EK算法,所以先讲这个算法.(我会去补知识点的!!!) 什么是网络流??? 读者们刚接触这个知 ...

  7. 图论-网络流⑦-费用流解题

    图论-网络流⑦-费用流解题 上一篇:图论-网络流⑥-费用流 下一篇:图论-网络流⑧-有上下界的网络流 参考文献: https://www.luogu.com.cn/blog/user9012/solu ...

  8. Codeforces.802C.Heidi and Library (hard) (费用流zkw)

    题目链接 复习了下餐巾计划问题.全忘了=-= 首先这是一道网络流.然后本题有\(n\)种建图方法,以及\(smy\) dalao还有单纯形做法. 先假设所有物品都是买入的.那么对于每一天,拆成两个点\ ...

  9. 【网络流】【待补】C. Heidi and Library (hard)

    http://codeforces.com/contest/802/problem/C 转载于:https://www.cnblogs.com/itcsl/p/6934931.html

  10. POJ - 1459 Power Network(网络流-最大流)

    题目链接:点击查看 题目大意:题意属实恶心,借用别的大佬的题意: 题目描述 一个电网包含一些结点(电站.消费者.调度站),这些结点通过电线连接.每个结点 uu 可能被供给 s(u) 的电能, s(u) ...

最新文章

  1. try catch 自定义捕获异常
  2. java applet退出功能_java-如何使用内置在applet中的Button在浏览器中停止applet?
  3. 01-iOS之wifi通讯开发简介
  4. 数据结构-循环单链表之约瑟夫问题
  5. Silverlight中开发和设计人员的合作文档信息
  6. [html] html6即将到来,你最期待的是什么特性呢?
  7. 2022年中国全屋智能行业研究白皮书
  8. Numpy 数据精度
  9. error: member “torch::jit::ProfileOptionalOp::Kind“ may not be initialized
  10. 基于jquery鼠标点击图片翻开切换效果
  11. CAN通讯与RS485通讯区别
  12. 【C语言】入门基础选择题附答案
  13. mysql 字段 符号_mysql数据库字段带符号的问题
  14. iphone禁止自动连接wifi操作方法「苹果教程」
  15. 修改已经上线的小程序名称
  16. 各博客平台编辑器使用测评
  17. 阿里技术专家深入浅出470页Java虚拟机设计与实现文档总结
  18. 【自动化测试】Pytest+Appium+Allure 做 UI 自动化的那些事
  19. 动物克隆技术应用价值_动物克隆技术及其研究现状
  20. DDCTF 北京地铁

热门文章

  1. 正确模仿别人的php项目,一个模仿oso的php论坛程序(之一)第1/2页
  2. 极简IEEE文献数据库入门
  3. Photoshop如何调整证件照背景色
  4. webpack随笔06-bulma
  5. 计算机自我鉴定范文7月,学员自我鉴定表7篇
  6. linux 通过ln -s建立链接文件后,如何通过链接文件查看源文件
  7. 启动mongoDB服务
  8. web开发路径问题解决
  9. HTTP 请求 报错信息406
  10. 使用ipad通过usb线连接电脑