网络流之当前弧优化浅谈

在dinic中,我们会发现,dfs中每条边都会遍历至少一遍,那么我们可以把一定不会用到的边删去吗?

答案是当然可以,这就用到了当前弧优化;

其实这个优化在很久很久以前学习欧拉回路的时候就接触到了;

每次增广一条路后可以看做“榨干”了这条路,既然榨干了就没有再增广的可能了。但如果每次都扫描这些“枯萎的”边是很浪费时间的。那我们就记录一下“榨取”到那条边了,然后下一次直接从这条边开始增广,就可以节省大量的时间。这就是 当前弧优化

实现方法就是每次dfs时将head数组复制一遍,然后再新数组中跑dfs

#include <bits/stdc++.h>
#define int long long
using namespace std;
struct littlestar{
	int to;
	int nxt;
	int w;
}star[10010];
int head[10010],cur[10010],cnt=1;
void add(int u,int v,int w)
{
	star[++cnt].to=v;
	star[cnt].nxt=head[u];
	star[cnt].w=w;
	head[u]=cnt;
}
int s,t;
queue<int> q;
int n;
int dep[10010];
bool bfs()
{
	for(int i=1;i<=n;i++){
		dep[i]=0;
		cur[i]=head[i];
	}
	while(q.size()) q.pop();
	q.push(s);
	dep[s]=1;
	while(q.size()){
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=star[i].nxt){
			int v=star[i].to;
			if(!dep[v]&&star[i].w){
				dep[v]=dep[u]+1;
				q.push(v);
				if(v==t) return 1;
			}
		}
	}
	return 0;
}
int m;
int dinic(int u,int flow)
{
	if(u==t) return flow;
	int rest=flow,tmp;
	for(int i=cur[u];i&&rest;i=star[i].nxt){
		cur[u]=i;
		int v=star[i].to;
		if(dep[v]==dep[u]+1&&star[i].w){
			tmp=dinic(v,min(star[i].w,rest));
			if(!tmp) dep[v]=0;
			star[i].w-=tmp;
			star[i^1].w+=tmp;
			rest-=tmp;
		}
	}
	return flow-rest;
}
signed main()
{
	cin>>n>>m>>s>>t;
	for(register int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
		add(v,u,0);
	}
	int maxflow=0;
	while(bfs()){
		int flow;
		while(flow=dinic(s,LLONG_MAX)) maxflow+=flow;
	}
	cout<<maxflow;
}

原文地址:https://www.cnblogs.com/kamimxr/p/11607636.html

时间: 2024-10-15 06:47:36

网络流之当前弧优化浅谈的相关文章

数据库管理及优化浅谈(MS SQL Server)

数据库管理 说起数据库管理——————首先要说的就是数据库设计,一个好的数据库设计理念能避免很多数据库引起的麻烦和后期维护的成本 1.首先要考虑的就是数据库权限和安全,首先有条件优先考虑的是将数据库部署在数据库集群,当然数据量不大冲从成本上考虑可以是不建议使用的 权限这个主要是登陆用户权限和架构合理搭配,最好一个架构对应一个用户名,方便后期规范和维护 2.说完数据库的权限下面当然是主要存储数据,数据怎么存,应该怎么规范,索引如何建立,后期数据量超大,该怎么分区,相信这些都是很多小伙伴心中的难题

App性能优化浅谈

前言 前段时间给公司的小伙伴们进行了关于app性能优化的技术分享.这里我稍微整理一下也给大家分享一下.关于性能优化这个话题非常大,涉及面能够非常广,也能够非常深入.本人能力有限,不会给大家讲特别难懂,特别底层的东西.都是我们开发能着手去做的点.大家都在讲性能优化,但对于项目经验不够丰富的朋友非常难有一个概念.做优化的时候也会比較茫然,这里我就给大家指明方向. 从何讲起? 笔者在做产品开发的时候,也遇到性能瓶颈.測试project师反馈了一些比較明显的问题,比方UI界面的过度绘制,列表滑动有明显卡

mysql配置优化浅谈(一)

MySQL对于web架构性能的影响最大,也是关键的核心部分.MySQL的设置是否合理优化,直接影响到web的速度和承载量!同时,MySQL也是优化难度最大的一个部分,不但需要理解一些MySQL专业知识,同时还需要长时间的观察统计并且根据经验进行判断,然后设置合理的参数. 下面我了解一下MySQL优化的一些基础,MySQL自身(my.cnf)的优化. 这里我介绍一些对性能影响较大的参数. 由于my.cnf文件的优化设置是与服务器硬件配置息息相关的,因而我们指定一个常见2U的服务器硬件环境:CPU:

浅谈C++容器动态内存管理的优化

在信息学竞赛中,C++的容器的用途非常广泛,但经常因常数过大而超时.怎样才能提高它们的效率呢? 我们知道,容器是存储同一类对象的对象,既然"对象"我们无法改变,那么我们只能从"存储"入手,不难想到,不同容器在实现上的根本区别是它们对应着不同的内存组织方式,内存管理无疑是这种实现的核心,所以优化内存管理是加快容器效率的最好途径之一. 一.内存分配器简介 怎样才能优化内存管理呢?很简单,C++为我们提供了这样的接口,我们可以通过自定义容器模板中的最后一个allocato

浅谈网站优化六步骤

1.分析关键词 这是进行SEO最重要的一环,关键词分析包括:关键词关注量分析.竞争对手分析.关键词与网站相关性分析.关键词部署.关键词排名预测. 2.网站架构分析 网站结构符合搜索引擎的蜘蛛喜好则有利于SEO.其中网站架构分析包括:剔除网站架构不友好设计.尽量使用树状目录结构.网站导航与链接优化. 2.关键词布局 SEO不仅仅只让网站首页在搜索引擎有好的排名,更为重要的是让网站的每个页面都带来一定流量.所以我们要为每个页面单独建设独一无二的页面主题(title,description)以及页面正

转:浅谈CSS在前端优化中一些值得注意的关键点

前端优化工作中要考虑的元素多种多样,而合理地使用CSS脚本可以在很大程度上优化页面的加载性能,以下我们就来浅谈CSS在前端优化中一些值得注意的关键点: 当谈到Web的“高性能”时,很多人想到的是页面加载时间,但其实性能不仅仅是指加载时间,还包括浏览器性能.网络性能.开发效率.在Web前端开发中,性能是一个非常重要的需要考虑的点.本文将介绍一些开发原则和性能准则,这些都是提高Web前端性能的基础. 1. 开发原则 1.1 编写符合当代浏览器性能的代码如果想提高前端性能,就必须理解浏览器的工作原理,

浅谈尾递归的优化方式

尾递归与Continuation 浅谈尾递归的优化方式

浅谈前端性能优化(移动端)

上一篇讲了PC端的部分:前端性能优化(PC端),这次继续说移动端的.相对于PC端的,移动web浏览器上有一些明显的特点:设备的屏幕小.新特性兼容性较好.支持一些比较新的HTML5和CSS3.需要与Native应用交互等.但移动端可用的CPU资源和网络资源极为有限,因此要做好移动端web上的优化往往需要考虑做更多的事情.首先在移动web的前端页面渲染中,PC的优化规则同样适用,此外针对浏览器也要做一些更细节的优化达到更好的效果.需要注意的是,并不是移动端的优化在PC端不适用,而是由于兼容性的原因,

浅谈PHP优化顺序

开发工程中我们可能会为自己的编程优化步骤感到困惑,不知该从何做起,这里我也结合相关资料和自己的经验,简要谈谈PHP优化顺序,望网页们给予补充和改进.1.代码优化  代码优化就是是平时写代码的一些良好的习惯与技巧等等比如尽可能的静态化一个方法,加载文件竟可能给完  整路径,清楚一些相似功能函数的区别等等...2.工具优化    做数据缓存(memcacheds)和页面缓存达到页面静态化3.优化sql语句   关键字大写,使用缩: 分行格式书写sql,查询时尽量少用* : 多表查询的时候尽可能的使用