第一次做最小割,不是很理解。

https://www.luogu.org/problemnew/show/P1361

要把东西分进两类里,好像可以应用最小割的模板,其中一类A作为源点,另一类B作为汇点,价值就是边的容量。

然后最小割一定会割断每个中间结点的两边的其中一边,这样最大价值就顺带求出来了。

在这道题里面额外还有某些点成组出现的额外价值。题解的办法是分别虚拟两个结点代表两个集合,源点到集合a的容量是其价值,然后从a连到他的附属结点各边容量为无穷。无穷的边不能被最小割割断。所以要么是把a的从属结点到t的边全部割断,然后多出来a的附加价值,要么是把s到a的附加价值边割断使a不能流向t。画个图发现很巧妙。

转载自:https://www.luogu.org/blog/ButterflyDew/solution-p1361

 这个属于最大权闭合子图,意思是某个节点(集合)若被选中则它的从属结点都要被选中,这种情况就原图建无穷流量边,各正权点连S容量为权,负权点连T容量为权的绝对值。答案=所有正权点的和-最小割。

当最小割割断右边的负权点的边的时候意味着你付出相应的代价购买它留在左边,当最小割割断左边的时候意味着你舍弃了他的价值但是也不用付出割断他的代价。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e6+,M=2e6+;
int n,m,s,t,tot=,lnk[N],ter[M],nxt[M],val[M],dep[N],cnr[N]; void add(int u,int v,int w) {
ter[++tot]=v,nxt[tot]=lnk[u],lnk[u]=tot,val[tot]=w;
} void addedge(int u,int v,int w) {
add(u,v,w),add(v,u,);
} int bfs(int s,int t) {
memset(dep,,sizeof(dep));
memcpy(cnr,lnk,sizeof(lnk));
std::queue<int> q;
q.push(s),dep[s]=;
while(!q.empty()) {
int u=q.front(); q.pop();
for(int i=lnk[u];i;i=nxt[i]) {
int v=ter[i];
if(val[i]&&!dep[v]) q.push(v),dep[v]=dep[u]+;
}
}
return dep[t];
} int dfs(int u,int t,int flow) {
if(u==t) return flow;
int ans=;
for(int i=cnr[u];i&&ans<flow;i=nxt[i]) {
cnr[u]=i;
int v=ter[i];
if(val[i]&&dep[v]==dep[u]+) {
int x=dfs(v,t,std::min(val[i],flow-ans));
if(x) val[i]-=x,val[i^]+=x,ans+=x;
}
}
if(ans<flow) dep[u]=-;
return ans;
} ll dinic(int s,int t) {
ll ans=;
while(bfs(s,t)) {
ll x;
while((x=dfs(s,t,<<))) ans+=x;
}
return ans;
} int main() {
ll sum=; scanf("%d",&n);
s=,t=; for(int i=;i<=n;i++){
int u=s,v=i,w;
scanf("%d",&w);
addedge(u,v,w);
sum+=w;
} for(int i=;i<=n;i++){
int u=i,v=t,w;
scanf("%d",&w);
addedge(u,v,w);
sum+=w;
} int m;
scanf("%d",&m); int id=n+;
while(m--) {
int k;
scanf("%d",&k);
int w1,w2;
scanf("%d%d",&w1,&w2);
addedge(s,id,w1);
addedge(id+,t,w2); sum+=w1+w2; for(int i=;i<k;i++){
int x;
scanf("%d",&x);
addedge(id,x,0x3f3f3f3f);
addedge(x,id+,0x3f3f3f3f);
}
id+=;
}
printf("%lld\n",sum-dinic(s,t));
return ;
}

洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图的更多相关文章

  1. 【BZOJ-3438】小M的作物 最小割 + 最大权闭合图

    3438: 小M的作物 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 825  Solved: 368[Submit][Status][Discuss ...

  2. 洛谷 P1361 小M的作物 解题报告

    P1361 小M的作物 题目描述 小M在MC里开辟了两块巨大的耕地\(A\)和\(B\)(你可以认为容量是无穷),现在,小\(P\)有\(n\)中作物的种子,每种作物的种子有1个(就是可以种一棵作物) ...

  3. [BZOJ3438][洛谷P1361]小M的作物

    题目大意:有A.B两个集合和n个物品,每个物品只能放在一个集合里.每个物品放在不同集合内能获得不同价值.有一些物品,如果它们同时放在一个集合内,则会产生新的价值(A和B中都有且不一定相同(c1和c2) ...

  4. 【POJ 2987】Firing (最小割-最大权闭合子图)

    裁员 [问题描述] 在一个公司里,老板发现,手下的员工很多都不务正业,真正干事员工的没几个,于是老板决定大裁员,每开除一个人,同时要将其下属一并开除,如果该下属还有下属,照斩不误.给出每个人的贡献值和 ...

  5. [模拟赛FJOI Easy Round #2][T3 skill] (最小割+最大权闭合子图(文理分科模型))

    [题目描述] 天上红绯在游戏中扮演敏剑,对于高攻击低防御的职业来说,爆发力显得非常重要,为此,她准备学习n个技能,每个技能都有2个学习方向:物理攻击和魔法攻击.对于第i个技能,如果选择物理攻击方向,会 ...

  6. [洛谷P1361]小M的作物

    题目大意:将作物种在A,B两地,对于每种作物,种A,B分别有不同的收益,对于一些特殊的作物集合,共同种到A,B集合分别有一些额外收益.求最大收益. 题解:最小割,S向i连容量为$a_i$的边,i向T连 ...

  7. P1361 小M的作物 最小割理解

    如果没有组合效益的存在 我们直接每个点两部分的最大值即可 换成网络流模型来看 即把S点看作是A田 把T点看作是B田 每种作物看作一个点 分别连边(S,i,A[i]) (i,T,B[i]) 最后图中所有 ...

  8. [P1361] 小M的作物 - 最小割

    没想到今天早上的第一题网络流就血了这么多发 从经典的二选一问题上魔改 仍然考虑最小割 #include <bits/stdc++.h> using namespace std; #defi ...

  9. BZOJ.1497.[NOI2006]最大获利(最小割 最大权闭合子图Dinic)

    题目链接 //裸最大权闭合子图... #include<cstdio> #include<cctype> #include<algorithm> #define g ...

随机推荐

  1. Android 支付宝快捷支付集成及ALI64错误的有效解决

    支付宝开放平台採用了RSA安全签名机制,开发人员能够通过支付宝公钥验证消息来源.同一时候可使用自己的私钥对信息进行加密. RSA算法及数字签名机制是支付宝开放平台与开发人员网关安全通信的基础.若开发人 ...

  2. [Node.js] Trigger a File Download in Express

    Downloading and saving a file is a common scenario when building out your web application. Using Exp ...

  3. iOS类的合理设计,面向对象思想

    每天更新的东西可能有反复的内容.当时每一部分的知识点是不同的,须要大家认真阅读 这里介绍了iOS类的合理设计.面向对象思想 main.m #import <Foundation/Foundati ...

  4. DW 表格与表单

    CSS样式表

  5. JS基础——构造函数VS原型

    JS是一种基于对象的语言.在使用过程中不免遇到复制对象的问题.但通常我们採用的直接赋值'obj1=obj2'这样的做法会出现数据覆盖问题. 也就是对象引用过程中引用地址一致.导致对象数据被改动的问题. ...

  6. lodar

    一个文件使用另一个文件的东西的时候需要使用到 export{开放} --watch 自动检测 可以加载打包的后边 module.exports = { entry:{ //入口文件 home:&quo ...

  7. CSS transform旋转问题

    我们都知道css的transform可以让旋转多少角度:transform:rotate(90deg),但是设置后只能旋转一次,如何想让它一直旋转下去怎么办?一种是使用matrix属性获取当前tran ...

  8. Html.Partial

    老革命永远都在遇上各种似是而非的老问题. 这次,是这个Html.Partial,分部页. Html.Partial与Html.Action有啥区别呢?区别就是,Html.Partial只有一个视图,而 ...

  9. POJ 2750 Potted Flower(线段树+dp)

    题目链接 虽然是看的别的人思路,但是做出来还是挺高兴的. 首先求环上最大字段和,而且不能是含有全部元素.本来我的想法是n个元素变为2*n个元素那样做的,这样并不好弄.实际可以求出最小值,总和-最小,就 ...

  10. Client should know only resource URIs and that’s all.

    REST Principles and Architectural Constraints – REST API Tutorial https://restfulapi.net/rest-archit ...