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

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

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+5,M=2e6+5;
int n,m,s,t,tot=1,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,0);
}int bfs(int s,int t) {memset(dep,0,sizeof(dep));memcpy(cnr,lnk,sizeof(lnk));std::queue<int> q;q.push(s),dep[s]=1;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]+1;}}return dep[t];
}int dfs(int u,int t,int flow) {if(u==t) return flow;int ans=0;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]+1) {int x=dfs(v,t,std::min(val[i],flow-ans));if(x) val[i]-=x,val[i^1]+=x,ans+=x;}}if(ans<flow) dep[u]=-1;return ans;
}ll dinic(int s,int t) {ll ans=0;while(bfs(s,t)) {ll x;while((x=dfs(s,t,1<<30))) ans+=x;}return ans;
}int main() {ll sum=0;scanf("%d",&n);s=0,t=10000;for(int i=1;i<=n;i++){int u=s,v=i,w;scanf("%d",&w);addedge(u,v,w);sum+=w;}for(int i=1;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+1;while(m--) {int k;scanf("%d",&k);int w1,w2;scanf("%d%d",&w1,&w2);addedge(s,id,w1);addedge(id+1,t,w2);sum+=w1+w2;for(int i=0;i<k;i++){int x;scanf("%d",&x);addedge(id,x,0x3f3f3f3f);addedge(x,id+1,0x3f3f3f3f);}id+=2;}printf("%lld\n",sum-dinic(s,t));return 0;
}

 

转载于:https://www.cnblogs.com/Yinku/p/10618586.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LVS

1、安装lvs 在分发器上在172.16.10.1上执行&#xff0c;事先应该配置好你的yum源&#xff0c;保证能够读取介质中的Cluster目录&#xff01;&#xff03;yum install ipvsadm编写&#xff0c;分发规则&#xff08;注意&#xff0c;清空之前的防火墙iptable -F ; iptable -t nat…

linux Swap交换分区概念

Swap交换分区概念 什么是Linux swap space呢&#xff1f;我们先来看看下面两段关于Linux swap space的英文介绍资料: Linux divides its physical RAM (random access memory) into chucks of memory called pages. Swapping is the process whereby a page of memory is copie…

ThinkPHP 数据库操作(七) : 视图查询、子查询、原生查询

视图查询 视图查询可以实现不依赖数据库视图的多表查询&#xff0c;并不需要数据库支持视图&#xff0c;例如&#xff1a; Db::view(User,id,name)->view(Profile,truename,phone,email,Profile.user_idUser.id)->view(Score,score,Score.user_idProfile.id)->where(…

C++中的结构体函数

代码 #include "stdafx.h"structTest{ intnum; Test() { printf("11111111"); } Test(inti) { this->numi; } voidfun() { printf("fun"); }};voidmain( void){ Test a(1); …

Linux 查看进程的命令

1、ps ps -x : 只显示当前用户下的所有进程信息 ps -aux : 所有用户下的进程信息 2、top 显示动态的进程信息&#xff0c;5s刷新一次&#xff1b; 3、htop 需要自己安装htop命令&#xff0c;比较牛&#xff0c;个人也只是简单使用过&#xff0c;比top命令快&#xff0c;可…

关于安卓手机在微信浏览器中无法调起相机的原因

最近功在做公司的一个项目&#xff0c;遇到安卓手机在微信浏览器中更换头像无法调起相机的问题&#xff0c;特来此记录一下。 1.微信没有相机权限&#xff0c;开启就行了。 2.〈input type“file” accept“image/*”/〉。图库和相机都能调起。 3.部分冷门手机因系统原因不开放…

使用Microsoft Media Service实现网络影音多媒体应用系列第三篇---技术要点

技术要点解说&#xff1a; l 对Media Service的引用 Imports Microsoft.WindowsMediaServices.Interop Imports System.Runtime.InteropServices 引入以上两个命名空间以后&#xff0c;就可以看到WMSServer这个类&#xff0c;它就是指向Media Service的类。Activator.CreateIn…

SEO新手入门笔记

2019独角兽企业重金招聘Python工程师标准>>> 上个月公司让我给产品网站做SEO&#xff0c;第一次做这种事情&#xff0c;从中学到一些新东西&#xff0c;在这里做一个总结。 什么是SEO SEO是“搜索引擎优化”的简称&#xff0c;目的是提升网站在搜索引擎结果中的排名…

学习进度(4)

记录时间&#xff1a; 第五周 所花时间&#xff08;包括上课&#xff09; 10h 代码量&#xff08;行&#xff09; 200行 博客量&#xff08;篇&#xff09; 0篇 了解到的知识点 深入学习数据库语句 转载于:https://www.cnblogs.com/quxiangjia/p/10676086.html

linux top 命令的结果

PID&#xff1a;进程标志号&#xff0c;是非零正整数USER&#xff1a;进程所有者的用户名PR&#xff1a;进程的优先级别NI&#xff1a;进程的优先级别数值VIRT&#xff1a;进程占用的虚拟内存值RES&#xff1a;进程占用的物理内存值SHR&#xff1a;进程使用的共享内存值S&#…

从语义开始 – 概念、意义、实践

从语义开始 – 概念、意义、实践http://bbs.blueidea.com/thread-2944769-1-1.html 转载于:https://www.cnblogs.com/javashi/archive/2010/05/21/1741019.html

通过Python脚本理解系统进程间通信

from socket import * #导入socket包中的所有内容from time import ctime #导入time包&#xff0c;同时在本地可使用ctime进行调用import os,sys #导入os&#xff0c;sys包HOSTlocalhost#定义主机PORT21567#定义端口BUFSIZ1024 #定义缓冲区ADDR(HOST,PORT) #定义元组tcpSerSoc…

EnterpriseDB Replication,复制Oracle数据测试(1)

EntepriseDB 复制软件目前支持多种数据库到postgre的复制&#xff0c;其基本结构由发布者(Publication)与订阅者(Subscriptions)组成,Replication软件可针对来自不同类型数据库的多个发布者&#xff0c;将其数据复制到多个订阅者(Subscriptions)数据库中。 其可能的几种拓扑结构…

远程桌面登录 Windows Server 2003时提示无权限

2019独角兽企业重金招聘Python工程师标准>>> 登录时弹出提示&#xff1a;要登录到这台远程计算机&#xff0c;您必须被授予允许通过终端服务登录的权限。默认地&#xff0c;"远程桌面用户"组的成员拥有该权限。如果您不是"远程桌面用户"组或其它…

BZOJ 1845三角形面积并

题目链接&#xff1a;http://www.lydsy.com:808/JudgeOnline/problem.php?id1845 给定100个三角形&#xff0c;求三角形面积并。 戴神模板太可怕。直接调用函数秒掉。思路有点繁琐&#xff0c;不大清楚。贴一个代码。 代码&#xff1a; /* **********************************…

每个大数据工程师都应该知道的OLAP 核心知识点

转载&#xff1a;https://mp.weixin.qq.com/s/I2WqQoGwK7LRrpB4R2pobw 很值得学习的一篇文章&#xff0c;不适用于初学者&#xff0c;适用于中级或者进阶高级的大数据工程师 OLAP 系统广泛应用于 BI, Reporting, Ad-hoc, ETL 数仓分析等场景&#xff0c;本文主要从体系化的角度…

高效便捷地创建单元格数据图表

您能想象折线图、柱状图这些图表被放在一个小小的单元格中的样子吗&#xff1f;Excel 2010的迷你图功能为您提供了这样的便捷体验&#xff0c;让您高效便捷地创建单元格数据图表&#xff01; 1&#xff0e;打开您想要创建迷你图的Excel工作簿&#xff08;如果它是Excel 97-200…

CLR Via CSharp读书笔记(7):常量和字段

{TODO:}转载于:https://www.cnblogs.com/thlzhf/archive/2012/12/06/2805424.html

高并发 高负载 网站系统架构 !深入讨论!【转载】

转载于:https://www.cnblogs.com/ifishing/archive/2010/05/26/1744339.html

聊透分布式系统一致性

一、强一致性 一致性大家庭中&#xff0c;虽然细分种类很多&#xff0c;但是实际上只有两大类&#xff0c;其中之一就是强一致性&#xff0c;其具体包含了严格一致性(也叫原子一致性或者线性一致性)和顺序一致性。 严格(原子/线性)一致性 严格一致性代表着&#xff0c;当数据更…