小M的作物 最大权闭合子图
题目大意
bzoj 3438
两个田\(A,B\)
\(n\le 1000\)种作物的种子
第\(i\)个种子,种\(A\)价值\(a[i]\),种\(B\)价值\(b[i]\)
再给出\(m\)个子集
第\(i\)个子集,如果子集中的点都种\(A\)增价\(c[i]\),都种\(B\)增价\(d[i]\)
求最大的价值
分析
我们看\(A\)高兴,我们先都种\(A\),那么我们直接拿到所有\(a,c\)
我们对方案进行修正
把子集看成点,我们把一个子集拆点拆成\(S_1,S_2\)
选\(S_1\)表示不要\(c\),选\(S_2\)表示要\(d\)
如果选一个种子\(i\),那么把它种到\(B\),变价\(b[i]-a[i]\),包含它的子集的\(S_1\)都要选
如果要选择\(S_2\),则该子集中的种子都要选
有了依赖关系和正权负权
跑一个最大权闭合子图即可
solution
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
const int M=3007;
const int N=2100007;
const int INF=1e9+7;
inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
}
struct vec{
int g[M],te;
struct edge{
int y,f,nxt;
edge(int _y=0,int _f=0,int _n=0){y=_y,f=_f,nxt=_n;}
}e[N];
vec(){te=1;}
inline void push(int x,int y,int f){
e[++te]=edge(y,f,g[x]);g[x]=te;
e[++te]=edge(x,0,g[y]);g[y]=te;
}
inline int& operator () (int x){return g[x];}
inline edge& operator [] (int x){return e[x];}
}e;
int n,m,res;
int S,T;
int a[M],b[M];
int c[M],d[M];
inline int id1(int x){return n+x;}
inline int id2(int x){return n+m+x;}
int lev[M];
bool bfs(){
static int q[M];
int h=0,t=1,x,p,y;
memset(lev,0,sizeof(lev));
lev[S]=1; q[1]=S;
while(h^t){
x=q[++h];
for(p=e(x);p;p=e[p].nxt)
if(e[p].f&&lev[y=e[p].y]==0){
lev[y]=lev[x]+1;
if(y==T) return 1;
q[++t]=y;
}
}
return 0;
}
int dfs(int x,int fl){
if(x==T) return fl;
int p,y,res=0,tp;
for(p=e(x);p;p=e[p].nxt)
if(e[p].f&&lev[x]+1==lev[y=e[p].y]){
tp=dfs(y,min(fl,e[p].f));
if(tp){
res+=tp;
fl-=tp;
e[p].f-=tp;
e[p^1].f+=tp;
if(fl==0) return res;
}
}
if(res==0) lev[x]=0;
return res;
}
int main(){
int i,j,x,y,z,tp;
n=rd();
for(i=1;i<=n;i++) a[i]=rd();
for(i=1;i<=n;i++) b[i]=rd();
m=rd();
for(i=1;i<=m;i++){
z=rd(),c[i]=rd(),d[i]=rd();
x=id1(i),y=id2(i);
for(j=1;j<=z;j++){
tp=rd();
e.push(tp,x,INF);
e.push(y,tp,INF);
}
}
S=0; T=id2(m)+1;
for(i=1;i<=n;i++){
res+=a[i];
tp=b[i]-a[i];
if(tp>0) e.push(S,i,tp),res+=tp;
else e.push(i,T,-tp);
}
for(i=1;i<=m;i++){
res+=c[i];
x=id1(i),y=id2(i);
e.push(x,T,c[i]);
e.push(S,y,d[i]),res+=d[i];
}
while(bfs()) res-=dfs(S,INF);
printf("%d\n",res);
return 0;
}
小M的作物 最大权闭合子图的更多相关文章
- 洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图
第一次做最小割,不是很理解. https://www.luogu.org/problemnew/show/P1361 要把东西分进两类里,好像可以应用最小割的模板,其中一类A作为源点,另一类B作为汇点 ...
- Solution -「最大权闭合子图」做题随笔
T1 小 M 的作物 先从简化题目入手,考虑先去掉 \(c\) 的额外收益.然后尝试将所有作物种在 \(B\), 则目前得到了 \(\sum \limits_{i = 1} ^n b_i\) 的收益. ...
- [BZOJ 1497][NOI 2006]最大获利(最大权闭合子图)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1497 分析: 这是在有向图中的问题,且边依赖于点,有向图中存在点.边之间的依赖关系可以 ...
- hiho 第119周 最大权闭合子图
描述 周末,小Hi和小Ho所在的班级决定举行一些班级建设活动. 根据周内的调查结果,小Hi和小Ho一共列出了N项不同的活动(编号1..N),第i项活动能够产生a[i]的活跃值. 班级一共有M名学生(编 ...
- [HIHO119]网络流五·最大权闭合子图(最大流)
题目链接:http://hihocoder.com/contest/hiho119/problem/1 题意:中文题意. 由于1≤N≤200,1≤M≤200.最极端情况就是中间所有边都是满的,一共有N ...
- 洛谷 P2762 太空飞行计划问题 P3410 拍照【最大权闭合子图】题解+代码
洛谷 P2762 太空飞行计划问题 P3410 拍照[最大权闭合子图]题解+代码 最大权闭合子图 定义: 如果对于一个点集合,其中任何一个点都不能到达此集合以外的点,这就叫做闭合子图.每个点都有一个权 ...
- BZOJ4873[Shoi2017]寿司餐厅——最大权闭合子图
题目描述 Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个 代号ai和美味度di,i,不同种类的寿司有可能使用相同的代号.每种寿司的份数都是无 ...
- BZOJ1565[NOI2009]植物大战僵尸——最大权闭合子图+拓扑排序
题目描述 Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻.该款游戏包含多 ...
- 【BZOJ1565】【NOI2009】植物大战僵尸 网络流 最大权闭合子图
题目大意 给你一个\(n\times m\)的地图,每个格子上都有一颗植物,有的植物能保护其他植物.僵尸从右往左进攻,每吃掉一颗植物就可以得到\(a_{i,j}\)的收益(\(a_{i,j}\)可 ...
随机推荐
- strong和weak
ios中使用ARC后,内存管理使用了新的关键字:strong(强引用) 和 weak(弱引用),默认是strong引用 strong: 使用strong类型指针指向的对象,会一直保持指向,直到所有st ...
- Linux磁盘I/O性能监控——iostat
iostat命令可以查看CPU利用率和磁盘性能相关数据,有时候我们会觉得系统响应慢,传数据很慢,这个慢可能是多方面原因导致的,如CPU利用率高.网络差.系统平均负载高甚至是磁盘已经损坏了.对此,系统性 ...
- 关于sql查询结果集的链接
开通博客有一段时间了,第一次博文.本身是个理工科的,没啥文采,就想着把平时遇到的问题记录下来,防止自己以后忘了还要去翻找. 今天看到同事写的代码,查询两张表里的数据,结果集类型是一样的.写了两条查询, ...
- Vue钩子函数生命周期实例详解
vue生命周期简介 Vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染→更新→渲染.卸载等一系列过程,我们称这是Vue的生命周期.通俗说就是Vue实例从创建到销毁 ...
- 20190102(多线程,守护线程,线程互斥锁,信号量,JoinableQueue)
多线程 多进程: 核心是多道技术,本质上就是切换加保存技术. 当进程IO操作较多,可以提高程序效率. 每个进程都默认有一条主线程. 多线程: 程序的执行线路,相当于一条流水线,其包含了程序的具体执行步 ...
- 数论:HDU1066-Last non-zero Digit in N!
题目: Last non-zero Digit in N! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- 继承Thread类使用多线程
java实现多线程有两种方式,一种是继承Thread类,另外一种就是实现Runnable接口. 两种实现方法的优缺点: 使用Thread类实现多线程局限性就是不支持多继承,因为java是不支持类多继承 ...
- loj2090 「ZJOI2016」旅行者
分治+最短路,很套路的 #include <algorithm> #include <iostream> #include <cstring> #include & ...
- oracle JOB 查询 添加 修改 删除
-------------查询JOB----------------- select job, what, next_date, next_sec, sysdate, failures, broken ...
- 相当牛X的java版星际游戏
分享一款牛人用java写的经典游戏,目录结构如下: 虽然只能算一个Demo,但是用到了很多Java基础技术和算法: Java2D,双缓冲,A星寻路,粒子系统,动画效果,处理图片,Swing ui ,U ...