首页 > 其他分享 >网络流

网络流

时间:2024-01-18 18:56:39浏览次数:23  
标签:cnt int head 网络 最小 贡献 dis

#1 模板

基础最大流(最小割)

const int MAXN=5e5+5,MAXM=6e5+5;
struct E{int nxt,to,w;}e[MAXM];
int head[MAXN],cur[MAXN];
int cnt=1;
void add(int u,int v,int w){
	e[++cnt]={head[u],v,w};head[u]=cnt;
	e[++cnt]={head[v],u,0};head[v]=cnt;
}
int dis[MAXN];
const int INF=0x3f3f3f3f;
int n,S,T;
bool bfs(){
    for(int i=1;i<=n;i++)   dis[i]=INF;
	queue<int> q;
	q.push(S);dis[S]=0;
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(e[i].w&&dis[v]>=INF){
				dis[v]=dis[u]+1;
				q.push(v);
			}
		}
	}
	return dis[T]<INF;
}
int dfs(int u,int limit){
	if(u==T)	return limit;
	int ret=0;
	for(int i=cur[u];i;i=e[i].nxt){
		int v=e[i].to;
		cur[u]=i;
		if(dis[v]==dis[u]+1&&e[i].w){
			int add=dfs(v,min(limit-ret,e[i].w));
			e[i].w-=add,e[i^1].w+=add,ret+=add;
			if(ret==limit)	return ret;
		}
	}
	return ret;
}
int dinic(){
	int ans=0;
	while(bfs()){
		for(int i=1;i<=n;i++)   cur[i]=head[i];
		ans+=dfs(S,INF);
	}
	return ans;
}

无源汇上下界可行流

步骤:

将原图 \(G\) 转化为只有上界限制的 \(G'\)。

在 \(G'\) 上新建虚拟源点汇点 \(S,T\)。一条 \(G\) 上的边 \((u,v,low,up)\) 转化为 \(G'\) 上的 \((u,v,up-low)\)。\(in_u=\sum _v{e(v,u).low}-\sum _v{e(u,v).low}\).

若 \(in_u > 0\) ,从 \(S\) 到 \(u\) 连接上限为 \(in_u\) 的边。

若 \(in_u < 0\) ,从 \(u\) 到 \(T\) 连接上限为 \(-in_u\) 的边。

若 \(G'\) 能满流,则存在可行流。

有源汇上下界可行流

设 \(s,t\) 表示原图规定的源点、终点。注意 \(S,T\) 是建网络流之后的虚点。

步骤:

想办法转换成 无源汇上下界可行流。如果我们找到了一条可行流,那么相当于从 \(s\) 流出了很多,流到了 \(t\)。现在只要在原图上加一条 \((t,s,0,inf)\)。表示从 \(t\) 到 \(s\) 的下界为0,上界为 \(inf\) 的边。找这个新图的无源汇可行流,就可以找到原图的有源汇可行流

有源汇上下界最大流

在跑完有源汇上下界可行流之后,从 \(s\) 到 \(t\) 跑残留网络上的最大流。注意要删除 \((t,s,0,inf)\) 这条边。

多源汇最大流

步骤:建虚点 \(S,T\)。\(S\) 向每一个源点连 \(inf\) 边,每一个汇点向 \(T\) 连 inf 边。跑普通最大流即可

#2 最大流建图方案

#3 最小割建图方案

跑完最大流之后。对于一个点 \(u\),只走不满流的边(剩余容量不为 \(0\)),能从 \(S\) 到

从 \(S\) 开始,只走不满流的边,能走到的 \(u\),都是属于 \(S\) 部。同理,


双向边的理解:省略了一个点

如图:

bef
aft


最小割

如何分化?https://www.cnblogs.com/Never-mind/p/8659982.html

最优选择: 文理分科 圈地计划

最基础的模型:只要看到 一个点,有两种选择。就要想到最小割。

每一个点 与 \(S\) 连的边的值为 “不取 \(S\) 的值的代价”。与 \(T\) 连的边的值为 “不取 \(T\) 的代价”。考虑一种选择方式,就是每一个点连的两条边,其中一条被割了之后。这个剩下的状态,如果 \(u\) 与 \(S\) 连通,表示 \(u\) 取 \(S\) 的值。你后面根据原题意要建什么虚点的时候,

最后跑最小割就是代价

最小割的边权一般都是 代价,因为一般都是让 代价 最小,而不是 贡献 最小。所以你在建图的时候要把贡献转化为代价。方式就是,把所有的可能的贡献(哪怕这些贡献不能并存)都先加上,再减去最小的使图合法的代价。“不取A的代价”可以转化为“取A的贡献”

多个点,所有都取一个值 产生的贡献(&)怎么表示?

1

上图为 val=A、B、C、D同时取 T 能获得的贡献。解释:你想,如果ABCD中又任意一个点取了S,那个点就会与S连通,那么t也就会与S连通,所以val这个边一定会被割掉。割掉就表示不能加在答案里。


多个点,某些点取 \(S\),某些点取 \(T\),可以获得贡献怎么表示?

这种情况下,题目背景一般会有一些关于这两类点的性质。通常黑白染色可以达到一部分题目的要求。


多个点,只要某一个点就可以产生的贡献(|)怎么表示?

这个时候要把这个情况拆成几种互不关联的情况。

比如 A、B 只要任意一个取到了 \(T\) 就可以获得 val的贡献。

把它转化成两个情况:

  1. A 取到 \(T\),可以获得 \(val\) 的贡献。

  2. A 没取到 \(T\) 并且 B 取到 \(T\),可以获得 \(val\) 的贡献。



模板错误合集:

  1. cnt初始值设为了 0

  2. \(n\) 在主函数内重新定义了一遍,所以全局的没有被修改

  3. for(int i=cur[i];i;i=e[i].nxt)

  4. 当前弧优化是 cur[u]=i 不是cur[i]=e[i].nxt 很多题都过得了后一种,但是是错的!!!


网络流最大流(最小割)唯一性判定

标签:cnt,int,head,网络,最小,贡献,dis
From: https://www.cnblogs.com/bwartist/p/17973187

相关文章

  • Wireshark网络工具是什么?
    Wireshark是网络包分析工具。网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细的情况。Wireshark是一个免费开源软件,不需要付费,免费使用,可以直接登陆到Wireshark的官网下载安装。在windows环境中,Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换,这个工具......
  • 克魔助手抓包教程:网络数据包分析利器
    摘要本文详细介绍了克魔助手(Komoxo)的下载安装、抓包示例、过滤器使用以及TCP三次握手分析等内容。通过丰富的代码案例演示和详细的操作步骤,帮助读者快速掌握克魔助手的使用方法。引言克魔助手是一款流行的网络封包分析软件,广泛应用于开发测试过程中的网络数据包定位与分析。本......
  • 轻量化CNN网络 - ShuffleNet
    1.ShuffleNetV1论文:ShuffleNet:AnExtremelyEfficientConvolutionalNeuralNetworkforMobileDevices网址:https://arxiv.org/abs/1707.01083提出了``ChannelShuffle`的思想,在ShuffleUnit中全是GConv和DWConv。GConv虽然能够减少参数与计算量,但GConv中不同组之间信......
  • 网络授时服务器 时钟同步服务器 gps时钟授时系统
    随着计算机网络规模的不断扩大,各种关键业务越来越多,口令保护、加密、电子认证等安全措施也日益显得重要,许多重要的安全措施都与时间有关。比如电子认证服务就要求加密证书的用户密码须严格与时间标记对应,该证书只在特定的时间窗口内有效,因此在该时间窗内,客户机的时间必须与服务器......
  • 腊八万事“粥”全,智安网络为您云安全保驾护航
    ......
  • Fetch方法——一种简单合理的跨网络异步获取资源方式
    FetchAPI是一个JavaScript接口,用于访问和操纵HTTP管道的一些具体部分,例如请求和响应。FetchAPI提供了一个全局fetch()方法,一种简单,合理的来跨网络异步获取资源的方式。一个基本的fetch请求:fetch("http://localhost:4000/datas.json",{method:"POST",......
  • 网络编程进阶
    网络编程进阶1.OSI7层模型OSI的7层模型对于大家来说可能不太好理解,所以我们通过一个案例来讲解:假设,你在浏览器上输入了一些关键字,内部通过DNS找到对应的IP后,再发送数据时内部会做如下的事:应用层:规定数据的格式。"GET/s?wd=你好HTTP/1.1\r\nHost:www.baidu.com\r\n\r......
  • 网络编程初识
    网络编程1.网络架构1.1交换机别人想和你的电脑相互连接然后进行资源的共享,此时就需要一个设备【二层交换机】组件一个局域网。当电脑接入交换机之后,我们需要为每台电脑分配一个IP,例如:-电脑1:192.168.10.1-电脑2:192.168.10.2-电脑3:192.168.10.3-电脑......
  • 网络编程
    网络编程cs架构与bs架构引入C/S和B/S都是互联网中常见的网络结构模型。(一)什么是C/S模型C是英文单词'Client'的首字母,即客户端的意思。C/S就是'Client/Server'的缩写,即'客户端/服务器'模式例如:拼多多APP等客户端。(二)什么是B/S模型B是英文单词'Browser'的首字母,即......
  • 【从零开始重学Java】第13天 Java网络功能
    前情提示从零开始重学Java第0天从零开始重学Java第1天Java概述从零开始重学Java第2天标识符和数据类型从零开始重学Java第3天表达式和流程控制语句从零开始重学Java第4天数组、向量和字符串从零开始重学Java第5天对象和类从零开始重学Java第6天异常从零开始......