`
java-mans
  • 浏览: 11895666 次
文章分类
社区版块
存档分类
最新评论

网络流总结(一)

 
阅读更多

一、个人心得:

今天对这些天网络流的学习做一个总结,最大流、二分图最大匹配、最小点覆盖、最小路径覆盖、最大独立集、最大点权独立集这样一路走来。其实对这些问题的熟悉仅仅只是一些皮毛而已,我比较不善于去论证和深究其中的联系,所以对这些个问题也只停留在理解的基础上,还不能很好地活学活用。建立流模型、二分图模型这点很重要,也是解题的关键,如果建立好了模型,那么问题就会迎刃而解了。


二、网络流学习中的基本定义和定理:

流网络:G = (V , E) 是一个有向图,其中每条边 (u, v) ∈ E 均有一非负容量 c (u , v) ≥ 0.s表示源点,t表示汇点。

残留网络:直观上讲,是由可以容纳更多网络流的边所组成。在不超过容量c ( u , v ) 的条件下,从u 到 v之间可以压入的额外网络流量就是(u , v) 的残余容量,可有公式定义:cf(u, v) = c(u, v) - f(u, v).

增广路经:为残留网络 Gf 中从 s 到 t 的一条简单路径。

流网络的割:流网络G = (V , E) 的割(S , T) 将V 划分为S 和 T = V - S两部分,使得s ∈ S,t ∈T。

最大流最小割定理:如果f 是具有源点 s 和 汇点 t 的流网络G = (V , E) 中的一个流,则下列条件是等价的:

1)f 是 G 的最大流

2)残留网络Gf 不含增广路经

3)对G 的某个割 (S, T) ,有 | f | = c ( S , T )

于是得出:最大流 = 最小割 //网络流的割或许是精髓,但是我好像没有理解

最小割的求解步骤:先求的最大流,再在得到最大流 f 的残余网络 Gf 中,从 s 开始深度优先遍历(DFS),所有遍历到的点,即构成点集S。

若果想要更深入了解最小割,参见:http://wenku.baidu.com/view/986baf00b52acfc789ebc9a9.html

最大流这个博客中讲的不错:http://www.cppblog.com/mythit/archive/2009/04/19/80470.html

二分图最大匹配:一个匹配是一个边的子集合 M ∈ E,且满足对所有顶点 v ∈ V,M中至多有一条边与v关联。最大匹配是最大势的匹配,在所有匹配中,边的权值和最大。

题型参考:http://blog.csdn.net/lhshaoren/article/details/7752944

最小点覆盖:用最少的点,让每条边都至少和其中一个点关联。

最小点覆盖数 = 最大匹配数

证明参见:http://www.cppblog.com/abilitytao/archive/2009/09/02/95147.html

最小点权覆盖:在所有覆盖集中,权值和最小的。

最小点权覆盖 = 最小割 = 最大流

最小路径覆盖:用最少的边,使之覆盖图中所有的顶点,且任何一个顶点有且只有一条路径与之关联。

最小路径覆盖数 = 顶点数 - 最大匹配数

证明参见:http://baike.baidu.com/view/2444809.htm

最大点独立集:用最多的边,组成一个点集,其中所有的点都不存在匹配关系。

最大点独立集 = 顶点数 - 最大匹配数。

最大点权独立集:在所有独立集中,权值和最大的独立集。

最大点权独立集 = 权值和 - 最小点权覆盖

三、涉及到的一些算法:

Ford_Fulkerson方法:用流网络的割来描述最大流的值,Ford_Fulkerson方法是一种迭代方法,开始时,对所有u , v ∈ V 有 f (u , v) = 0,然后在每次迭代中,通过寻找一条增广路经来增加流值,得到最大流。

伪代码:

Ford_Fulkerson(G, s, t)
	for each edge(u, v) ∈ E[G]
		do f[u, v] = 0
			f[v, u] = 0
	while there exists a path p from s to t in the residual network Gf
		//存在增广路经
		do cf(p) = min(cf(u, v) : (u, v) is in p)
			//找到增广路经中残余容量最小的边
		for each edge(u, v) in p
			do f[u, v] -= cf(p)
			do f[v, u] += cf(p)


Edmonds_Karp算法:广度优先搜索寻找增广路经。算法复杂度:O(V*E*E)

具体代码参见:http://blog.csdn.net/lhshaoren/article/details/7748992

dinic算法:网络流最大流的优化算法之一,每一步对原图进行分层,然后用DFS求增广路径。算法复杂度:O(V*V*E),所以当边比较多时候比较适合使用

1、初始化流量,计算出残余网络
2、根据残余网络计算层次图,如果汇点不在层次图中,则算法结束
3、在层次图内用一次dfs过程增广
4、转步骤2

具体代码参见:http://blog.csdn.net/lhshaoren/article/details/7765901


分享到:
评论

相关推荐

    ACM竞赛网络流算法讲义

    的学科在信息技术领域中扮演着至关重要的角色,网络流算法是图论的一个重要分支,它在计算机科学,尤其是算法竞赛如ACM(国际大学生程序设计竞赛)中有着广泛的应用。网络流问题通常涉及到在一个有向图中从源点到...

    计算机网络协议总结

    计算机网络协议总结 计算机网络协议是计算机网络中实现数据传输和通信的基础。网络协议的种类繁多,各有其特点和应用场景。本文将对计算机网络协议进行总结,涵盖物理层、数据链路层、网络层、传输层和应用层等多个...

    网络流算法和PASCAL程序

    网络流理论是在图论中发展起来的一种理论与方法,主要用于解决网络上的一类最优化问题。1955年,T.E. 哈里斯首次提出了在一个给定的网络上寻求两点间最大运输量的问题。1956年,L.R. 福特和 D.R. 富尔克森等人给出了...

    网络流总结·小编

    网络流算法分析,谢谢~ 里面有各种实现的算法和代码,另外 SAP 为主要算法; 另外网络流的上下界、费用流的讲解都有哦。

    经典网络流教程.ppt

    总结起来,网络流问题是一种优化问题,旨在最大化从源点到汇点的流量,同时遵守容量限制。在实际应用中,如本例所示的太空站迁移问题,网络流模型可以帮助我们找到最优的资源配置策略。通过使用如Ford-Fulkerson算法...

    网络流算法艺术

    网络流算法是一种在图论中用于解决流量分配问题的数学工具,广泛应用于计算机科学,特别是图算法和网络优化领域。本文将深入探讨网络流算法的核心概念,包括Ford-Fulkerson方法、Edmonds-Karp算法和Dinic算法。 1. ...

    动态网络流分类研究 动态网络流模型

    总结来说,动态网络流分类研究通过对网络流量的微观层面分析,揭示了用户的网络行为模式。这不仅增加了我们对网络交互行为的认识深度,而且为网络安全和网络管理提供了有力的技术支持。尽管网络行为的复杂性意味着这...

    网络流教程(max_flow)

    #### 一、网络流概述 本教程旨在系统地介绍网络流(Network Flow)的基本概念、理论基础及其在计算机科学领域的应用。网络流问题是一类重要的图论问题,在很多实际场景中都有广泛的应用,如交通规划、物流配送、...

    C#流使用总结

    总结,`Stream`在C#中扮演着至关重要的角色,无论是处理文件、内存、网络还是加密解密,都离不开它的身影。理解和熟练运用`Stream`及其子类,对于提升C#应用程序的I/O性能至关重要。通过实践和学习,开发者可以更好...

    《JAVA_IO流学习总结》

    八、网络流 - Socket和ServerSocket提供了网络通信的能力,相关的InputStream和OutputStream类用于在网络连接上进行数据交换。 九、NIO(New IO) Java NIO是Java 1.4引入的新特性,提供了非阻塞I/O操作,包括...

    网络流问题

    **网络流(Network Flows)**是图论中的一项重要研究领域,主要用于解决一类最优化问题。它不仅理论基础深厚,而且应用广泛,涉及物流优化、计算机网络设计等多个领域。 在**网络流**的概念中,我们通常将一个有向图...

    网络流算法的在信息学中的应用

    总结来说,网络流算法在网络流算法在网络流算法在网络流算法在信息学中的应用信息学中的应用信息学中的应用中的应用广泛且强大,能够处理多种实际问题。通过构造合适的网络模型并应用优化技巧,我们可以有效地求解...

    网络流(最大流)SAP源码

    本文主要解析一个关于网络流中的最短增广路径算法(Shortest Augmenting Path,简称SAP)的C++实现代码。该算法在解决最大流问题时通过选择最短路径进行增广来提高效率。此外,代码还包含了Gap Heuristic和Current ...

    最大网络流Dinic算法

    总结起来,Dinic算法是解决最大网络流问题的一种高效方法,通过层次结构和增广路径的概念,能够在保证正确性的前提下,实现较好的运行效率。在实际应用中,它可以用于解决资源分配、调度、通信网络流量规划等问题。

    图割算法汇总及网络流介绍

    总结来说,图割算法主要处理图像分割和分类问题,而网络流理论是处理资源分配和传输问题的关键工具。通过福特-富克逊算法和圈算法,我们可以求解网络中的最大流和最小费用最大流,以实现优化目标。在实际应用中,...

    网络流算法详解

    网络流算法是计算机科学与数学领域中的一个重要分支,广泛应用于资源分配、物流规划、任务调度等实际问题中。其中,最大流问题是最基本的问题之一,它研究的是如何在网络中找到最大的数据传输量。本文将详细介绍几种...

    基于道路的网络流模型

    本文介绍了一种基于道路的网络流模型,旨在优化区域疏散过程中的交通流,减少交通拥堵及延迟,特别是在交叉路口处发生的交通冲突。该模型是基于最小成本流问题的一种整数扩展,可以通过调整车辆行驶距离与汇流之间的...

    22考研-曲阜师范大学-网络知识点总结.docx

    计算机网络是由一些通用的、可编程的硬件互连而成的,而这些硬件并非专门用来实现某一特定目的。这些可编程硬件能够用来传送多种不同类型的数据,并能够支持广泛的和日益增长的应用。 计算机网络由若干节点和连接...

    通过url获取网络位置上的文件流

    总结来说,Java中通过URL获取网络位置上的文件流涉及创建URL对象,建立连接,打开输入流,处理数据并关闭流。这个过程可以封装到工具类中,方便在不同场景下复用。在实际编程中,还需要考虑错误处理和性能优化。

    Java IO流总结

    总的来说,Java IO流是一个强大的工具集,它涵盖了各种数据源和目标的输入输出操作,从简单的文件读写到复杂的网络通信和对象序列化。理解并熟练运用Java IO流是成为一名合格的Java开发者的必备技能之一。通过深入...

Global site tag (gtag.js) - Google Analytics