传送门

洛谷

Solution

这是一个比较实用的套路,很多题目都有用,而且这个套路难以口胡出来。
考虑把每一个附加贡献重新建一个点,然后向必需的点连边,流量为val。
然后直接种植的从源点向这个点连,流量为val。
最后跑一个最小割就可以了。

代码实现

#include<bits/stdc++.h>
using namespace std;
const int N=500010,Inf=1e9+10;
int front[N],cnt,s,t,n;
struct node
{int to,nxt,w;
}e[1500010];
queue<int>Q;
int dep[N];
void Add(int u,int v,int w)
{e[cnt]=(node){v,front[u],w};front[u]=cnt++;e[cnt]=(node){u,front[v],0};front[v]=cnt++;
}
bool bfs()
{memset(dep,0,sizeof(dep));Q.push(s);dep[s]=1;while(!Q.empty()){int u=Q.front();Q.pop();for(int i=front[u];i!=-1;i=e[i].nxt){int v=e[i].to;if(!dep[v] && e[i].w){dep[v]=dep[u]+1;Q.push(v);}}                       }return dep[t];
}
int dfs(int u,int flow)
{if(u==t || !flow)return flow;for(int i=front[u];i!=-1;i=e[i].nxt){int v=e[i].to;if(dep[v]==dep[u]+1 && e[i].w){int di=dfs(v,min(flow,e[i].w));if(di){e[i].w-=di;e[i^1].w+=di;return di;}else dep[v]=0;}}return 0;
}
int dinic()
{int flow=0;while(bfs()){while(int d=dfs(s,Inf))flow+=d;}return flow;
}
int m;
int main()
{memset(front,-1,sizeof(front));scanf("%d",&n);int sum=0;t=100000;int tot=n;for(int i=1;i<=n;i++){int x;scanf("%d",&x);sum+=x;Add(s,i,x);}for(int i=1;i<=n;i++){int x;scanf("%d",&x);sum+=x;Add(i,t,x);}scanf("%d",&m);while(m--){int k,c1,c2;scanf("%d%d%d",&k,&c1,&c2);++tot;Add(s,tot,c1);Add(tot+1,t,c2);sum+=c1+c2;for(int i=1;i<=k;i++){int id;scanf("%d",&id);Add(tot,id,Inf);Add(id,tot+1,Inf);}++tot;}printf("%d\n",sum-dinic());return 0;
}

转载于:https://www.cnblogs.com/mle-world/p/10549703.html

【洛谷1361】 小M的作物(最小割)相关推荐

  1. 洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图

    第一次做最小割,不是很理解. https://www.luogu.org/problemnew/show/P1361 要把东西分进两类里,好像可以应用最小割的模板,其中一类A作为源点,另一类B作为汇点 ...

  2. 洛谷 - P1361 小M的作物(最大流最小割)

    题目链接:点击查看 题目大意:给出 n 个植物,每个植物种在 A 农场的收益是 a[ i ] ,种在 B 农场的收益是 b[ i ] ,再给出 m 组关系,每组中的所有植物如果都在 A 农场的话额外收 ...

  3. (最小割)洛谷P1361 小M的作物

    洛谷P1361 小M的作物 思路: 这是一个两者取一的模型,将点集一分为二. 最小割在数值上等同于最大流.割去权值和最小的边,使图分成两部分,割下来的边权值和为最小割. 对于此题,先不考虑种在一起的情 ...

  4. P1361 小M的作物(最小割)

    P1361 小M的作物(最小割) 比较板子的题,关键是建图. 答案就是 s u m − sum- sum−最小割. 而根据最小割最大流定理,即可求出最小割. 复习一下 Dinic 算法流程: bfs给 ...

  5. 网络流建图方法(二)——辅助点(虚点)决策法洛谷 P1361 小M 的作物 Dinic

    inic声明:本博客默认读者会最大流最小割的定理,会Dinic, 最小割在数值上 == 最大流 但是在意义上没有任何关系,姑且可以这样求得最小割,当然可以自行百度最小割的证明定理 还是从题目开始说起 ...

  6. 洛谷 P1646 [国家集训队]happiness 网络流 最小割 Dinic+当前弧优化

    题目链接: https://www.luogu.com.cn/problem/P1646 参考博客: https://siyuan.blog.luogu.org/solution-p1646 算法:网 ...

  7. 洛谷 - P2774 方格取数问题(最小割-最大流+奇偶拆点)

    题目链接:点击查看 题目大意:给出一个n*m的棋盘,每个位置都有一个正整数,现在要从方格中取数,要求任意两个数在方格中的位置不相邻,求取出的数的最大和 题目分析:正难则反,在这个题目中正着建图比较难, ...

  8. 洛谷2046 BZOJ2007 NOI2010 海拔 平面图最小割

    题目链接 题意: 给你一个网格图,正反边边权不同,从海拔低的地方到海拔高的地方的代价是海拔差乘边权,海拔高到海拔低的地方不需要代价.左上角海拔是0,右下角海拔是1,让你任意安排其他点的海拔,使得每条边 ...

  9. 洛谷 P4430 小猴打架

    洛谷 P4430 小猴打架 题目描述 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打 ...

  10. 2017提高组D1T1 洛谷P3951 小凯的疑惑

    洛谷P3951 小凯的疑惑 原题 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想 ...

最新文章

  1. 具有absolute、relative、fixed的div设置宽度和高度的效果
  2. 实例18:python
  3. 滑动窗口解决最小子串问题 leetcode3. Longest Substring Without Repeating Characters
  4. Disconnected from the target VM, address:xxxx 或者 Process finished with exit code 1 终极解决办法 idea
  5. 深度学习————如何在Python中求解函数的解析表达式
  6. 图像语义分割(7)-PSPNet:金字塔型场景解析网络
  7. RTMP WireShark抓包实例说明
  8. js封装倒计时函数实现倒计时效果
  9. 编译原理 实验1《词法分析程序设计与实现》
  10. 使用js脚本实现网页版微信定时发送信息
  11. 【无标题】C基础 2
  12. Rust-WebAssembly 开发者布道师招聘
  13. 在html中写for循环表格trtd,嵌套的HTML表格在javascript for循环
  14. 基于搜狗接口的微信公众号及其信息爬取
  15. 236_自定义抽签器二
  16. 英国豪迈收购Static Systems,大力推进医疗市场
  17. 【CDOJ 1334】 郭大侠与Rabi-Ribi
  18. 10年C++程序员告诉你为什么你的简历没人看?7份案例分析
  19. 有无监督,上下游任务,高斯分布,BN总结
  20. 柯西-施瓦兹不等式和闵可夫斯基不等式证明

热门文章

  1. ORACLE REDO 日志调整
  2. 【Android】动态UI : LayoutParams.addRule(...) LayoutParams.addRule(..., ...)
  3. kotlin学习笔记——扩展函数(anko)和网络请求
  4. [Swift]LeetCode944. 删除列以使之有序 | Delete Columns to Make Sorted
  5. 搭建一个自己的SVN服务器
  6. setTimeout 和 setInterval
  7. 实现当前目录下开启CMD
  8. location.pathname;outline:medium;undefined不能加引号
  9. 谁能够在萧条中生存?历史总是惊人相似的(转)
  10. 从零开始学ios开发(十):Multiview Applications(多个xib之前的切换)