首页 > 其他分享 >网络瘤24题解+总结

网络瘤24题解+总结

时间:2023-07-26 18:12:00浏览次数:40  
标签:24 总结 容量 连边 int 题解 路径 合并 dcc

目录

网络流24题

顺序主观决定

太空飞行计划

教训:(开始想费用流,搞半天出不来)

网络流解决最大/小费用问题,要么最小割最大流,要么最小费用流

最小费用流的前提是最大流,所以在有一些点可以不取换最优代价的时候,是不可行的。

当每个点都只能取一次的时候,可以考虑费用化为容量,求最小割/最大流

回到这个题,假如我们把一个实验所需器材用有向边连起来,问题就化为了:

在一个二分图中,左部点向右部点有若干连边,若选择了某一个左部点,则所连右部点必选。求最后最大的点权和

将其转化为有向图,问题化为:

在一张有向图中,选出一个子图,满足选择了一个点,它的后继所有点都必选,求最大和

最大权闭合子图模型

这个模型是用来解决上述问题的。

定理:若将源点与所有正权点连边,容量为点权,汇点与所有负权点连边,容量为点权的相反数,同时保留原有向图所有边,容量正无穷,则正权点的点权和减去最小割即为所求。

证明

被割掉的边的意义:

  1. 边 \((s,u,w[u])\) 被割,表示不选 \(u\)
  2. 边 \((v,t,w[v])\) 被割,表示 \(v\)

这样就可以求出最大权闭合子图的点集,进而求出图 \(G'\)

引理:Dinic 算法最后一次分层(failed)的 \(dep\) 数组就可以用来判断可达性。可达的点构成了最大权闭合子图

由此,我们可以由源点向每个实验连边,容量为收益,由汇点向每个器材连边,容量为代价。由每个实验向所需器材连边,容量正无穷。

若某实验没被割,则加入答案。若某器材被割,则加入答案。

    read(m);read(n);int ans=0;s=n+m+1,t=n+m+2;num=t; 
	for(int i=1;i<=m;i++){
		int y;
		int x=read(y);
		add(s,i,y);ans+=y;
		while(!x){
			int y;x=read(y);
			add(i,m+y,inf);
		}
	}//鬼畜输入
	for(int i=1;i<=n;i++){
		int x;read(x);add(m+i,t,x); 
	}
	ans-=dinic();
	for(int i=1;i<=m;i++)if(dep[i])cout<<i<<" ";
	cout<<"\n";
	for(int i=m+1;i<=n+m;i++)if(dep[i])cout<<i-m<<" ";cout<<"\n";
	cout<<ans<<"\n";

最小路径覆盖问题

给定一个DAG,求其最小路径覆盖。

这里体现的重要思想有两个:

  1. 将一个点的不同状态拆分,化为左右部,分别求解
  2. 部分计算,合并答案
  3. 正难则反,拆分——>合并

首先,我们将在DAG里路径的过程过来,变路径。最初将 \(n\) 个点都单独是做一条路径。

然后我们考虑合并路径的操作。要路径条数最少,则合并次数最多。

注意到有向图中,每个点有两个状态:作为该边的入点,作为该边的出点。而在路径合并中,显然要区分开这两种状态,只能入状态向出状态合并。

为什么?我们需要的是合并次数,而非正常建图的流量。求最大流,也即最大化流量,而现在我们要最大化合并次数,所以合并次数就是我们的流量,而合并次数为了判重(一个点最多给1次),必须一对对拆。

显然原图一条边最多提供1次合并,那么对于原图的每一条边,由入状态向出状态的另一端点连边,容量1,表示提供1的合并次数。

那么对于入状态的点,可以找一个点合并,则由源点向其连边,容量1

对于出状态的点,可以被一个点合并,则由其向汇点连边,容量1

综上,我们将一个点拆为 \(i,i+n\),建立边 \((s,i,1),(i+n,t,1),(u,v+n,1)\)跑最大流,即可得到最大合并次数。

用总点数减去最大合并次数即可得到最小路径数。

关于方案输出?网络流的方案输出一般体现在满流边和残量网络上,当然也可以像动态规划一样记录上一个点

这里常用的方法是由汇点开始找残量网络,找到的路径就对应了合并关系。

但更简单的方法?注意到原图里边的容量全是1,那么就必有 \(lst\) 唯一,在网络流DFS过程中直接记录 \(lst\),倒回来输出即可。

请注意,这里还没完,我们只得到了若干对合并关系,但不能就此输出整个路径。我们可以通过合并关系确定每个点在合并后路径上的 \(lst\),然后根据路径终点直接跳就好(终点判断:标记是否被记录过作为合并的主动方)

vector<int>f[N];int dcc; 
int vis[N],suf[N];
void init(){
	cin>>n>>m;s=n+n+1,t=n+n+2;num=t;
	for(int i=1;i<=m;i++){
		int u,v;cin>>u>>v;add(u,v+n,1);
	}
	for(int i=1;i<=n;i++)add(s,i,1);
	for(int i=n+1;i<=n<<1;i++)add(i,t,1);
	int ans=dinic();
	for(int i=head[t];i;i=nxt[i]){
		if(cost[i]==1){
			++dcc;int x=ver[i];
			while(x!=s){
				f[dcc].push_back(x),x=lst[x];
			}
			if(f[dcc][1]>n)f[dcc][1]-=n;
			if(f[dcc][0]>n)f[dcc][0]-=n;
			suf[f[dcc][1]]=f[dcc][0];vis[f[dcc][0]]=1;
		}
	} 
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			int x=i;
			while(x){
				cout<<x<<" ";x=suf[x];
			}cout<<"\n";
		}
	}
	cout<<n-ans<<"\n";
}

下面来看一个同为网络流24题的变形题。

Trick总结

标签:24,总结,容量,连边,int,题解,路径,合并,dcc
From: https://www.cnblogs.com/oierpyt/p/17583239.html

相关文章

  • kafka rebalance 总结(更新中)
    KAFKA2.3 以后,consumer分为dynamic和static,以是否设置了group.instance.id属性区分。以默认的consumer为例,即dynamicconsumer,以下图描述其正常的生命周期:依赖FindCoordinator,JoinGroup,SyncGroup,Heatbeat,LeaveGroup等接口,kafkaconsumer 和broker联合......
  • P5369 [PKUSC2018] 最大前缀和 题解
    传送门题目大意给定一个序列,求任意重排\(n!\)中情况所以的最大非空前缀和的和。模\(998244353\)。\(n\e20\),\(\sum|a_i|\le10^9\)题目解析考虑最大前缀和的性质,有:对于最大前缀和部分,所有的真后缀大于等于零。(最大前缀和可能小于零)对于不在最大前缀和的后半部分,所......
  • 1124.longest well performing interval
    Description1124.LongestWell-PerformingInterval(Medium)Wearegivenhours,alistofthenumberofhoursworkedperdayforagivenemployee.Adayisconsideredtobeatiringdayifandonlyifthenumberofhoursworkedis(strictly)greaterthan......
  • 易生信转录组培训第一期总结
    易生信九天的转录组分析培训班第一期伴随着5个小时的考试在紧张中结束了。说是培训,倒不如研讨更确切些。在一个个问题的交流中学会转录组分析,效果远大于一人讲,自己练。先分享两张现场的照片前两天以集中讲练为主,在讲述了原理后,进行上机操作。大部分学员有一定的Linux和R基础,上手......
  • [JOI 2022 Final] 自学 题解
    洛谷传送门1.题意简述:一个学期有\(N\)天\(N*M\)节课,每天的第\(i\)节课可以选择效果\(a_i\)的学习与\(b_i\)的自习。问应如何安排每节课,使所有功课最小值最大?2.思路:这道题想直接模拟非常麻烦,但是如果我们能够灵活运用二分算法,这道题就非常简单了。考虑到数据范围较......
  • luogu P9474 [yLOI2022] 长安幻世绘 详细题解
    原题:P9474[yLOI2022]长安幻世绘看到很多大佬的题解直接讲了做法,本蒟蒻看得不是很懂,调了很久才把这题做出来,于是写了这篇比较详细的题解谈一下我做这题从头到尾的思路,希望对各位有帮助qwq。思路我们首先思考这样一个问题,如果已经知道最终答案对应的最大值和最小值,又不知道题......
  • AT_agc017_b 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法,请放心阅读。题目简述一共有\(n\)个格子,给定两个整数\(A,B\)分别位于第\(1\)和第\(n\)格,中间有\(n−2\)个空格。询问是否存在一种填数方案满足任意相邻两个数之差的绝对值在\([C,D]\)之间。依次输入\(n,a,b,c,d\)......
  • AT_arc149_a 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。题目简述求满足以下条件的小于\(10^n\)数最大是多少?每一位数字均相同;是\(m\)的倍数。数据范围:\(1\len\le10^5\),\(1\lem\le10^9\)。思路首先每位数字都相同很好满足,仅需......
  • 题解:【ICPC WF 2021 L】 Where Am I?
    题目链接这年WF较为简单的一道了,直接模拟即可。首先可以预处理出它顺时针螺旋轨迹的移动步数,方便过会算距离直接查表。我偷懒直接用map记录的距离表,这样不用处理复数下标的问题。注意到\(X\)的数量不会超过\(100\)个,所以我们可以反过来从标记点上入手。找出所有的标记点,......
  • 洛谷 P2894 [USACO08FEB] Hotel G 题解
    题目链接P2894[USACO08FEB]HotelG-洛谷|计算机科学教育新生态(luogu.com.cn)分析考虑用线段树维护区间信息维护sum(最大连续空房间数)如何合并?sum1为max(sum2,sum3)(1的两个子区间)但我们发现若区间为100001(0表示空房间)sum1=4而max(sum2,sum3)=2所以再维护suml(从左开始的......