首页 > 其他分享 >网络流复杂度证明

网络流复杂度证明

时间:2024-06-16 17:55:34浏览次数:15  
标签:cur 增广 int 复杂度 网络 证明 dep num

EK(转) dinic(转)

EK(未完)

以此份代码为例

//P3376 【模板】网络最大流
//EK算法 
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=410,M=10010;
int n,m,S,T,h[N],e[M],w[M],ne[M],idx,pre[N],dist[N],st[N],ans,g[N][N];
void add(int a,int b,int c){
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
bool bfs(){
	memset(st,0,sizeof st);
	queue<int> q;
	q.push(S);
	st[S]=1;
	dist[S]=(int)(1e18);
	while(q.size()){
		int t=q.front();q.pop();
		for(int i=h[t];~i;i=ne[i]){
			int j=e[i];
			if(!w[i]||st[j])continue;
			dist[j]=min(dist[t],w[i]);
			pre[j]=i;
			st[j]=1;
			q.push(j);
			if(j==T)return 1;
		}
	}
	return 0;
}
void update(){
	int cur=T;
	while(cur!=S){
		int i=pre[cur];
		w[i]-=dist[T];
		w[i^1]+=dist[T];
		cur=e[i^1];
	}
	ans+=dist[T];
}
signed main(){
	memset(h,-1,sizeof h);
	cin>>n>>m>>S>>T;
	for(int i=1;i<=m;i++){
		int a,b,c;
		cin>>a>>b>>c;
		if(g[a][b])w[g[a][b]-2]+=c;
		else{
			add(a,b,c);
			add(b,a,0);
			g[a][b]=idx;
		}
	}
	while(bfs())update();
	cout<<ans;
} //by yjx

EK算法单次bfs复杂度为 \(O(m)\)。

Dinic(未完)

#include<bits/stdc++.h>
#define fir first
#define se second
#define int long long
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
template <typename type>
inline void read(type &x) {
	x=0; bool f=0; char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-') f=1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	if(f) x=-x;
}
template <typename type,typename ...t>
inline void read(type &x,t &...te) {read(x); read(te...);}
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=210,M=1e4+50;
int n,m;
int head[N],nxt[M],to[M],W[M],num=1;
int S,T;
void add(int u,int v,int w) {
	++num; nxt[num]=head[u]; to[num]=v; W[num]=w; head[u]=num;
	++num; nxt[num]=head[v]; to[num]=u; W[num]=0; head[v]=num;
}
int cur[N],dep[N];
bool bfs() {
	memset(dep,-1,sizeof(dep));
	queue<int>q;
	q.push(S);
	cur[S]=head[S];
	dep[S]=1;
	while(!q.empty()) {
		int u=q.front(); q.pop();
		for(int i=head[u];i;i=nxt[i]) {
			int v=to[i];
			if(W[i]&&dep[v]==-1) {
				dep[v]=dep[u]+1;
				cur[v]=head[v];
				if(v==T) return true;
				q.push(v);
			}
		}
	}
	return false;
}
ll dfs(int u,ll lim) {
	ll flow=0;
	if(u==T) return lim;
	for(int i=cur[u];i&&flow<lim;i=nxt[i]) {
		int v=to[i];
		cur[u]=i;
		if(W[i]&&dep[v]==dep[u]+1) {
			ll t=dfs(v,min(lim-flow,W[i]));
			if(!t) dep[v]=-1;
			W[i]-=t;
			W[i^1]+=t;
			flow+=t;
		}
	}
	return flow;
}
int dinic() {
	int ans=0,flow;
	while(bfs()) 
		while(flow=dfs(S,0x3f3f3f3f)) 
			ans+=flow;
	return ans;
}
signed main() {
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	read(n,m,S,T);
	for(int i=1;i<=m;i++) {
		int u,v,w;
		read(u,v,w);
		add(u,v,w);
	}
	printf("%lld",dinic());
	return 0;
}

Dinic算法单次bfs复杂度为 \(\text{O}(m)\)

增广轮数<=n

单轮增广复杂度 \(\text{O}(nm)\)

下面我们来证明dinic增广轮数<=n

首先dinic会按照层数分层,将长度最短的增广路径全部删除,因此进行一遍dfs后,S到T在残量网络上的距离将会改变。

现在我们证明每一次S到T在残量网络上的距离将会增加1

设此时S到u经过若干条边后联通,S经过若干条边与v联通且dis(S,v)>dis(S,u)距离(不联通也是相同道理,相当于在不经过u的情况下S到v的距离为INF),v经过若干条边与T联通,且S->u->v->T是最短的一条增广路径,而u->v是增广路径上边权最小的边。

经过一遍增广后,此时残量网络会变成这样

此时S->u->v->T不联通,而dis(S,v)>dis(S,u),因此添加v->u边并不会让S到T的距离更小。

因此只会让S->T距离增大,且至少增加1。又因为dis(S,T)最大为n,因此增广轮数最多为n。

下面我们来证单轮增广复杂度 \(\text{O}(nm)\)

首先每次推流会清空至少一条边u->v,而此时添加的反向边不满足dep[v]==dep[u]+1,因此最多清空 \(\text{O}(m)\) 次,对于清空每一条边需要找到一条他所对应的增广路,此时最多从S访问到T,因此总复杂度为 \(\text{O}(mn)\)。

因此Dinic复杂度为 \(O(n^2m)\)。

(从复杂度分析就可很显然地看出,Dinic复杂度在正常题目建图情况下达不到该上界,因此总是跑得飞快)

by lyk

借鉴了[该地址](Dinic算法复杂度证明 | yukiyama (iyukiyama.github.io))内容

标签:cur,增广,int,复杂度,网络,证明,dep,num
From: https://www.cnblogs.com/classblog/p/18250979

相关文章

  • 网络工程师:华为设备巡检命令
    设备的稳定性和性能直接影响整个网络的运行,定期进行设备巡检是保障网络稳定运行的重要措施。本文将详细介绍华为设备巡检命令及其应用,帮助网络管理员高效管理和维护设备。设备巡检是指通过各种命令和工具检查网络设备的状态,以预防故障和优化性能。华为设备的巡检有助于:......
  • 算法人生(22):从“生成对抗网络”看“逆商提升”
    ​在图像生成与编辑、音频合成、视频生成领域里,有一个非常重要的深度学习方法——生成对抗网络(简称GANs),它是由两个神经网络组成的模型,分别为生成器(Generator)和判别器(Discriminator),这两个网络相互博弈,通过对抗学习的方式来训练,以便生成逼真的数据样本。它的大致步骤如下:初始......
  • 江西省职业院校技能竞赛“网络安全”赛项样题
    赛题说明一、竞赛项目简介“网络安全”竞赛共分A.基础设施设置与安全加固;B.网络安全事件响应、数字取证调查和应用安全;C.CTF夺旗-攻击;D.CTF夺旗-防御等四个模块。竞赛时间安排和分值权重见表1。二、竞赛注意事项1.竞赛期间禁止携带和使用移动存储设备、计算器、通......
  • 全面的初级入门指南,从安装到基本使用,再到一些高级功能的介绍,帮助用户在实际操作中逐步
    大纲:WindowsNmap初级使用教程1.简介什么是Nmap?Nmap的主要功能和用途安全和法律注意事项2.安装Nmap前提条件从官方网站下载Nmap安装步骤验证安装3.基本使用打开命令提示符运行你的第一个Nmap扫描示例命令:nmap目标IP地址理解基本的输出结果4.常用扫......
  • dijkstra 复杂度证明
    我们用以下代码为例分析复杂度#include<bits/stdc++.h>#include<climits>#definefirfirst#definesesecondusingnamespacestd;typedeflonglongll;typedefpair<ll,int>PII;inlineintread(){ intx=0,f=1;charc=getchar(); while(c<'0......
  • 【计算机网络仿真实验-实验2.7】单臂路由
    实验2.7单臂路由1.实验拓扑图2.测试连通性测试PC1PC2PC3之间的连通性无法ping通,因为它们处在不同的网段,而二层交换机不具备路由功能,因此没办法接通3.在交换机上创建vlan10,并将端口0/2划分到vlan10中Switch>enableSwitch#configureterminal......
  • 深度神经网络
    深度神经网络(DeepNeuralNetwork,简称DNN)是一种复杂的机器学习模型,主要用于处理和分析大规模数据。它是神经网络的一种扩展,包含多个隐藏层,可以更好地捕捉数据中的复杂模式和特征。 深度神经网络的基本构成1.输入层(InputLayer):负责接收原始数据,每个节点对应一个特征。2.隐......
  • 为企业提供了跨地域、跨网络环境的一键接入云体验
    随着云计算技术的不断发展,企业对云服务的依赖越来越深。然而,面对多云环境、跨地域部署和复杂网络环境等挑战,如何实现高效、稳定、安全的云连接,成为众多企业关注的焦点。联通云联网以其丰富的全球资源、灵活统一的管理、强大的安全性和高可靠性,为企业提供了跨地域、跨网络环境的一......
  • PyTorch学习9:卷积神经网络
    文章目录前言一、说明二、具体实例1.程序说明2.代码示例总结前言介绍卷积神经网络的基本概念及具体实例一、说明1.如果一个网络由线性形式串联起来,那么就是一个全连接的网络。2.全连接会丧失图像的一些空间信息,因为是按照一维结构保存。CNN是按照图像原始结构进......
  • 如何在网络上找到适合的外链平台
    在当前日益竞争激烈的网络环境中,想要提升网站的曝光度和排名是每个网站主人和网络营销人员的共同目标。而外链作为一种有效的网站优化手段,被广泛应用于各种网络推广活动中。本文将向您介绍如何寻找适合的外链平台,以帮助您达到更好的网络营销效果。首先,寻找适合的外链平台需要了解......