从一道题目的解法试谈网络流的构造与算法
数学建模中的网络流问题与算法
数学建模中的网络流问题与算法数学建模是一种将实际问题转化为数学模型,并通过数学方法求解的过程。
在实际问题中,常常需要解决网络流问题,即在网络中如何最大化或最小化流量的分配问题。
网络流算法是解决网络流问题的重要工具。
本文将分析网络流问题的基本概念和应用,并介绍常用的网络流算法。
一、网络流问题的基本概念1.网络流模型网络流模型是指将实际问题转化为图中节点和边的组合,并进行流量分配的问题。
其中,节点表示供给和需求单位,边表示可以流动的路径。
网络流模型常用于物流、运输、通信等领域的问题求解。
2.流量网络流问题中的流量表示在网络中通过路径的物理量。
流量可以是货物的数量、电信系统中数据的传输速率等。
流量可以是有向的或无向的,有时还会带有容量的限制。
3.割在网络中,将节点集划分为两个互不相交的子集,这个划分称为割。
割可以用来描述流量限制或流量约束。
在最小割问题中,割的容量描述了限制在网络中流量的最小边数。
二、网络流问题的应用1.最大流问题最大流问题是网络流问题中的一种,目标是在网络中从源节点到汇节点找到可行的最大流量。
最大流算法可以用于求解交通流优化问题、工作调度等。
2.最小割问题最小割问题是网络流问题中的另一种形式,目标是在网络中找到一个割,使得割的边数最小。
最小割算法可以用于求解电力系统分析、路网规划等问题。
3.多组源汇问题多组源汇问题是一种特殊的网络流问题,可以有多个源节点和汇节点,并且在每个节点之间还有容量限制。
多组源汇问题在物流调度、通信网络优化等领域有广泛应用。
三、常用的网络流算法1.最大流算法常用的最大流算法有Ford-Fulkerson算法、Edmonds-Karp算法和Dinic算法等。
这些算法利用增广路径或增广路进行迭代,直到无法找到增广路径为止。
2.最小割算法最小割算法有Ford-Fulkerson算法和推进-重贴算法等。
这些算法通过不断削减割的容量来求解最小割问题。
3.二部图匹配算法二部图匹配算法可以看做是一种特殊的网络流算法。
NOI国家集训队论文分类(至2008)(摘抄自C博客)
摘抄自C博客组合数学计数与统计2001 - 符文杰:《Pólya原理及其应用》2003 - 许智磊:《浅谈补集转化思想在统计问题中的应用》2007 - 周冬:《生成树的计数及其应用》2008 - 陈瑜希《Pólya计数法的应用》数位问题2009 - 高逸涵《数位计数问题解法研究》2009 - 刘聪《浅谈数位类统计问题》动态统计2004 - 薛矛:《解决动态统计问题的两把利刃》2007 - 余江伟:《如何解决动态统计问题》博弈2002 - 张一飞:《由感性认识到理性认识——透析一类搏弈游戏的解答过程》2007 - 王晓珂:《解析一类组合游戏》2009 - 曹钦翔《从“k倍动态减法游戏”出发探究一类组合游戏问题》2009 - 方展鹏《浅谈如何解决不平等博弈问题》2009 - 贾志豪《组合游戏略述——浅谈SG游戏的若干拓展及变形》母函数2009 - 毛杰明《母函数的性质及应用》拟阵2007 - 刘雨辰:《对拟阵的初步研究》线性规划2007 - 李宇骞:《浅谈信息学竞赛中的线性规划——简洁高效的单纯形法实现与应用》置换群2005 - 潘震皓:《置换群快速幂运算研究与探讨》问答交互2003 - 高正宇:《答案只有一个——浅谈问答式交互问题》猜数问题2003 - 张宁:《猜数问题的研究:<聪明的学生>一题的推广》2006 - 龙凡:《一类猜数问题的研究》数据结构数据结构2005 - 何林:《数据关系的简化》2006 - 朱晨光:《基本数据结构在信息学竞赛中的应用》2007 - 何森:《浅谈数据的合理组织》2008 - 曹钦翔《数据结构的提炼与压缩》结构联合2001 - 高寒蕊:《从圆桌问题谈数据结构的综合运用》2005 - 黄刚:《数据结构的联合》块状链表2005 - 蒋炎岩:《数据结构的联合——块状链表》2008 - 苏煜《对块状链表的一点研究》动态树2006 - 陈首元:《维护森林连通性——动态树》2007 - 袁昕颢:《动态树及其应用》左偏树2005 - 黄源河:《左偏树的特点及其应用》跳表2005 - 魏冉:《让算法的效率“跳起来”!——浅谈“跳跃表”的相关操作及其应用》2009 - 李骥扬《线段跳表——跳表的一个拓展》SBT2007 - 陈启峰:《Size Balance Tree》线段树2004 - 林涛:《线段树的应用》单调队列2006 - 汤泽:《浅析队列在一类单调性问题中的应用》哈希表2005 - 李羽修:《Hash函数的设计优化》2007 - 杨弋:《Hash在信息学竞赛中的一类应用》Splay2004 - 杨思雨:《伸展树的基本操作与应用》图论图论2005 - 任恺:《图论的基本思想及方法》模型建立2004 - 黄源河:《浅谈图论模型的建立与应用》2004 - 肖天:《“分层图思想”及其在信息学竞赛中的应用》网络流2001 - 江鹏:《从一道题目的解法试谈网络流的构造与算法》2002 - 金恺:《浅谈网络流算法的应用》2007 - 胡伯涛:《最小割模型在信息学竞赛中的应用》2007 - 王欣上:《浅谈基于分层思想的网络流算法》2008 - 周冬《两极相通——浅析最大—最小定理在信息学竞赛中的应用》最短路2006 - 余远铭:《最短路算法及其应用》2008 - 吕子鉷《浅谈最短径路问题中的分层思想》2009 - 姜碧野《SPFA算法的优化及应用》欧拉路2007 - 仇荣琦:《欧拉回路性质与应用探究》差分约束系统2006 - 冯威:《数与图的完美结合——浅析差分约束系统》平面图2003 - 刘才良:《平面图在信息学中的应用》2007 - 古楠:《平面嵌入》2-SAT2003 - 伍昱:《由对称性解2-SAT问题》最小生成树2004 - 吴景岳:《最小生成树算法及其应用》2004 - 汪汀:《最小生成树问题的拓展》二分图2005 - 王俊:《浅析二分图匹配在信息学竞赛中的应用》Voronoi图2006 - 王栋:《浅析平面Voronoi图的构造及应用》偶图2002 - 孙方成:《偶图的算法及应用》树树2002 - 周文超:《树结构在程序设计中的运用》2005 - 栗师:《树的乐园——一些与树有关的题目》路径问题2009 - 漆子超《分治算法在树的路径问题中的应用》最近公共祖先2007 - 郭华阳:《RMQ与LCA问题》划分问题2004 - 贝小辉:《浅析树的划分问题》数论欧几里得算法2009 - 金斌《欧几里得算法的应用》同余方程2003 - 姜尚仆:《模线性方程的应用——用数论方法解决整数问题》搜索搜索2001 - 骆骥:《由“汽车问题”浅谈深度搜索的一个方面——搜索对象与策略的重要性》2002 - 王知昆:《搜索顺序的选择》2005 - 汪汀:《参数搜索的应用》启发式2009 - 周而进《浅谈估价函数在信息学竞赛中的应用》优化2003 - 金恺:《探寻深度优先搜索中的优化技巧——从正方形剖分问题谈起》2003 - 刘一鸣:《一类搜索的优化思想——数据有序化》2006 - 黄晓愉:《深度优先搜索问题的优化技巧》背包问题2009 - 徐持衡《浅谈几类背包题》匹配2004 - 楼天城:《匹配算法在搜索问题中的巧用》概率概率2009 - 梅诗珂《信息学竞赛中概率问题求解初探》数学期望2009 - 汤可因《浅析竞赛中一类数学期望问题的解决方法》字符串字符串2003 - 周源:《浅析“最小表示法”思想在字符串循环同构问题中的应用》多串匹配2004 - 朱泽园:《多串匹配算法及其启示》2006 - 王赟:《Trie图的构建、活用与改进》2009 - 董华星《浅析字母树在信息学竞赛中的应用》后缀数组2004 - 许智磊:《后缀数组》2009 - 罗穗骞《后缀数组——处理字符串的有力工具》字符串匹配2003 - 饶向荣:《病毒的DNA———剖析一道字符匹配问题解析过程》2003 - 林希德:《求最大重复子串》动态规划动态规划2001 - 俞玮:《基本动态规划问题的扩展》2006 - 黄劲松:《贪婪的动态规划》2009 - 徐源盛《对一类动态规划问题的研究》状态压缩2008 - 陈丹琦《基于连通性状态压缩的动态规划问题》状态设计2008 - 刘弈《浅谈信息学中状态的合理设计与应用》树形DP2007 - 陈瑜希:《多角度思考创造性思维——运用树型动态规划解题的思路和方法探析》优化2001 - 毛子青:《动态规划算法的优化技巧》2003 - 项荣璟:《充分利用问题性质——例析动态规划的“个性化”优化》2004 - 朱晨光:《优化,再优化!——从《鹰蛋》一题浅析对动态规划算法的优化》2007 - 杨哲:《凸完全单调性的加强与应用》计算几何立体几何2003 - 陆可昱:《长方体体积并》2008 - 高亦陶《从立体几何问题看降低编程复杂度》计算几何思想2004 - 金恺:《极限法——解决几何最优化问题的捷径》2008 - 程芃祺《计算几何中的二分思想》2008 - 顾研《浅谈随机化思想在几何问题中的应用》圆2007 - 高逸涵:《与圆有关的离散化》半平面交2002 - 李澎煦:《半平面交的算法及其应用》2006 - 朱泽园:《半平面交的新算法及其实用价值》矩阵矩阵2008 - 俞华程《矩阵乘法在信息学中的应用》高斯消元2002 - 何江舟:《用高斯消元法解线性方程组》数学方法数学思想2002 - 何林:《猜想及其应用》2003 - 邵烜程:《数学思想助你一臂之力》数学归纳法2009 - 张昆玮《数学归纳法与解题之道》多项式2002 - 张家琳:《多项式乘法》数形结合2004 - 周源:《浅谈数形结合思想在信息学竞赛中的应用》黄金分割2005 - 杨思雨:《美,无处不在——浅谈“黄金分割”和信息学的联系》其他算法遗传算法2002 - 张宁:《遗传算法的特点及其应用》2005 - 钱自强:《关于遗传算法应用的分析与研究》信息论2003 - 侯启明:《信息论在信息学竞赛中的简单应用》染色与构造2002 - 杨旻旻:《构造法——解题的最短路径》2003 - 方奇:《染色法和构造法在棋盘上的应用》一类问题区间2008 - 周小博《浅谈信息学竞赛中的区间问题》序2005 - 龙凡:《序的应用》系2006 - 汪晔:《信息学中的参考系与坐标系》物理问题2008 - 方戈《浅析信息学竞赛中一类与物理有关的问题》编码与译码2008 - 周梦宇《码之道—浅谈信息学竞赛中的编码与译码问题》对策问题2002 - 骆骥:《浅析解“对策问题”的两种思路》优化算法优化2002 - 孙林春:《让我们做得更好——从解法谈程序优化》2004 - 胡伟栋:《减少冗余与算法优化》2005 - 杨弋:《从<小H的小屋>的解法谈算法的优化》2006 - 贾由:《由图论算法浅析算法优化》程序优化2006 - 周以苏:《论反汇编在时间常数优化中的应用》2009 - 骆可强《论程序底层优化的一些方法与技巧》语言C++2004 - 韩文弢:《论C++语言在信息学竞赛中的应用》策略策略2004 - 李锐喆:《细节——不可忽视的要素》2005 - 朱泽园:《回到起点——一种突破性思维》2006 - 陈启峰:《“约制、放宽”方法在解题中的应用》2006 - 李天翼:《从特殊情况考虑》2007 - 陈雪:《问题中的变与不变》2008 - 肖汉骏《例谈信息学竞赛分析中的“深”与“广”》倍增2005 - 朱晨光:《浅析倍增思想在信息学竞赛中的应用》二分2002 - 李睿:《二分法与统计问题》2002 - 许智磊:《二分,再二分!——从Mobiles(IOI2001)一题看多重二分》2005 - 杨俊:《二分策略在信息学竞赛中的应用》调整2006 - 唐文斌:《“调整”思想在信息学中的应用》随机化2007 - 刘家骅:《浅谈随机化在信息学竞赛中的应用》非完美算法2005 - 胡伟栋:《浅析非完美算法在信息学竞赛中的应用》2008 - 任一恒《非完美算法初探》提交答案题2003 - 雷环中:《结果提交类问题》守恒思想2004 - 何林:《信息学中守恒法的应用》极限法2003 - 王知昆:《浅谈用极大化思想解决最大子矩形问题》贪心2008 - 高逸涵《部分贪心思想在信息学竞赛中的应用》压缩法2005 - 周源:《压去冗余缩得精华——浅谈信息学竞赛中的“压缩法”》逆向思维2005 - 唐文斌:《正难则反——浅谈逆向思维在解题中的应用》穷举2004 - 鬲融:《浅谈特殊穷举思想的应用》目标转换2002 - 戴德承:《退一步海阔天空——“目标转化思想”的若干应用》2004 - 栗师:《转化目标在解题中的应用》类比2006 - 周戈林:《浅谈类比思想》分割与合并2006 - 俞鑫:《棋盘中的棋盘——浅谈棋盘的分割思想》2007 - 杨沐:《浅析信息学中的“分”与“合”》平衡思想2008 - 郑暾《平衡规划——浅析一类平衡思想的应用》。
论中的网络流问题
论中的网络流问题网络流问题是图论中研究的一个重要问题,它在许多实际应用中有着广泛的应用。
本文将以网络流问题为核心,探讨其在图论中的作用及应用,并对相关概念和算法进行介绍。
一、网络流问题的定义和表示网络流问题是指在一个有向图中,给定一个源点s和一个汇点t,每条边都有一个容量限制,要求从源点s到汇点t的最大流量。
可以用图的形式来表示网络流问题,其中节点表示图中的点,边表示两点之间的连接关系,边上的数字表示该边的容量限制。
二、网络流问题的模型网络流问题可以用图模型来描述,其中节点表示图中的点,边表示两点之间的连接关系,边上的数字表示该边的容量限制。
图中的边分为正向边和反向边,正向边表示从源点s到汇点t的流量,反向边表示从汇点t到源点s的流量。
三、网络流问题的求解方法网络流问题可以采用多种求解方法,常用的有增广路径算法和最小割算法。
1. 增广路径算法增广路径算法是一种常用的解决网络流问题的方法。
它通过不断寻找从源点s到汇点t的增广路径,并在路径上增加或减少流量来求解最大流量。
2. 最小割算法最小割算法是另一种常用的解决网络流问题的方法。
它通过将图划分为两个部分,使得源点s在一部分,汇点t在另一部分,并使得割边的容量最小,从而求解最大流量。
四、网络流问题的应用网络流问题在实际应用中有着广泛的应用,下面介绍几个典型的应用场景。
1. 传输网络规划网络流问题在传输网络规划中有着重要的应用,可以用来优化数据传输的路径,提高传输效率。
2. 任务分配问题网络流问题可以用来解决任务分配问题,将任务分配给不同的处理器,使得总任务处理时间最小。
3. 最大匹配问题网络流问题可以用来解决最大匹配问题,即在一个二分图中找到最大的匹配数。
5. 最小费用流问题网络流问题还可以用来解决最小费用流问题,即在满足流量约束的情况下,使得总费用最小。
六、总结网络流问题作为图论中的一个重要问题,有着广泛的应用。
本文介绍了网络流问题的定义和表示、模型和求解方法,并介绍了其在实际应用中的几个典型场景。
算法设计与分析中的算法与网络流
算法设计与分析中的算法与网络流算法在计算机科学中扮演着重要的角色。
它们是解决问题的步骤和规则的有序集合,可以在计算机上自动执行。
在算法设计与分析的学习中,算法与网络流成为了一个重要的领域。
本文将探讨算法与网络流的关系以及在算法设计与分析中的应用。
一、算法与网络流的关系算法是解决问题的有序步骤,而网络流是一种用来描述物体、信息或能量在网络中传输的模型。
算法可以通过网络流来解决一系列相关问题,例如最短路径、最大流、最小割等。
网络流算法通过建立图模型,将问题转化为图中物体、信息或能量的流动问题,并使用各种技术和策略来解决。
二、网络流算法的应用1. 最短路径问题在网络中,最短路径算法可以用来找到两个节点之间最短路径的长度。
其中一个经典的算法是Dijkstra算法,它通过不断更新起始节点到其他节点的最短路径长度来求解。
另一个常用的算法是Floyd-Warshall算法,它通过动态规划的方式计算任意两个节点之间的最短路径长度。
2. 最大流问题最大流算法可以用来计算网络中从源节点到汇节点的最大流量。
其中最著名的算法是Ford-Fulkerson算法,它通过反复寻找增广路径来不断增加流量,直到达到最优解。
另一个常用的算法是Edmonds-Karp算法,它使用广度优先搜索来寻找增广路径。
3. 最小割问题最小割算法可以用来找到将图划分成两个部分的最小代价。
其中一个著名的算法是stoer-wagner算法,它通过不断合并最小割集合中的节点来计算最小割的大小。
4. 匹配问题匹配算法可以用来找到图中的最大匹配或完美匹配。
其中著名的算法是匈牙利算法,它通过构建交错树来寻找增广路径,从而不断增加匹配的大小。
三、算法设计与分析中的挑战在算法设计与分析中,我们需要考虑如何设计出高效的算法来解决问题。
然而,算法设计中的挑战在于如何权衡时间复杂度和空间复杂度。
某些算法可能会在时间上更高效,但却需要占用大量的空间。
相反,有些算法可能在空间上更高效,但却需要牺牲一些时间。
信息学奥赛网络流算法介绍与分析
信息学奥赛网络流算法介绍与分析网络流算法是指一类用于解决网络中最大流、最小割等问题的算法。
最大流问题是指在网络中找到从源节点到汇节点的最大流量,而最小割问题则是指在网络中找到一个割,使得源节点和汇节点之间的最小边权和。
网络流算法的核心思想是建立一个虚拟的可行流网络,然后通过不断调整网络中各个边的流量来达到最优解。
以下是三种常见的网络流算法介绍与分析。
1. Ford-Fulkerson算法Ford-Fulkerson算法是最经典的网络流算法之一,也是很多网络流算法的基础。
它通过不断寻找增广路径来求解最大流问题。
增广路径是指在残余网络中存在的一条从源节点到汇节点的路径,其各边的残余容量大于0。
通过不断增加该路径上的流量,直到找不到增广路径为止,就可以得到最大流量。
Ford-Fulkerson算法的时间复杂度取决于增广路径的寻找方式,一般情况下为O(fE),其中f为最大流量,E为网络中的边数。
2. Edmonds-Karp算法Edmonds-Karp算法是基于Ford-Fulkerson算法的改进算法,它使用广度优先来寻找增广路径。
在每次寻找增广路径时,Edmonds-Karp算法总是选择路径上经过的边权最小的边作为增广路径中的瓶颈边。
这种选择策略保证了每次增加的流量都是最小的,从而使得算法的收敛速度更快。
Edmonds-Karp算法的时间复杂度为O(VE^2),其中V为网络中的节点数,E为网络中的边数。
3. Dinic算法Dinic算法是一种快速求解最大流问题的算法,它基于分层残余网络的概念。
分层残余网络是指在残余网络上按照路径长度构建的一种分层结构。
Dinic算法首先通过BFS构建分层残余网络,然后使用DFS在分层残余网络上增广路径。
与Ford-Fulkerson算法和Edmonds-Karp算法相比,Dinic算法避免了重复增广路径的情况,从而大大减少了算法的时间复杂度。
Dinic算法的时间复杂度为O(V^2E),其中V为网络中的节点数,E 为网络中的边数。
网络流问题及其求解方法
网络流问题及其求解方法网络流问题是指在一个有向图中,给定网络的容量限制,找到从源点到汇点的最大流量。
这个问题在实际生活中有着广泛的应用,比如在运输、通信、电力等领域。
本文将介绍网络流问题以及几种常见的求解方法。
1. 网络流问题的定义网络流问题可以用有向图来表示。
图中的每条边具有一个容量,表示该边能够通过的最大流量。
同时,图中有一个源点,表示流量的起点,以及一个汇点,表示流量的终点。
问题的目标是找到从源点到汇点的最大流量。
2. 求解方法一:最短增广路径算法最短增广路径算法是一种基于广度优先搜索的方法。
算法的思想是在图中不断寻找增广路径,即从源点到汇点且每条边的流量都满足容量限制的路径。
然后通过增加路径上的流量来更新网络的流量,并继续寻找下一个增广路径。
直到找不到增广路径为止,即可得到最大流量。
3. 求解方法二:最大流-最小割定理最大流-最小割定理是网络流问题的一个重要性质。
该定理指出,网络的最大流量等于它的最小割。
最小割是指将网络分成两个部分,一部分包含源点,另一部分包含汇点,并且割边的总容量最小。
根据该定理,可以通过寻找最小割来求解网络流问题。
4. 求解方法三:Ford-Fulkerson算法Ford-Fulkerson算法是一种经典的求解网络流问题的方法。
该算法通过不断寻找增广路径来更新网络的流量,直到无法再找到增广路径为止。
算法的关键在于如何选择增广路径,一种常见的选择策略是使用深度优先搜索。
Ford-Fulkerson算法的时间复杂度与最大流的大小有关,一般情况下为O(fE),其中f为最大流量,E为图中边的数量。
总结:网络流问题是一个重要的优化问题,在实际应用中具有广泛的应用。
本文介绍了网络流问题的定义以及几种常见的求解方法,包括最短增广路径算法、最大流-最小割定理和Ford-Fulkerson算法。
这些算法都可以有效地求解网络流问题,并在实践中得到广泛应用。
通过研究网络流问题及其求解方法,可以为实际问题的建模和解决提供有力的工具。
网络流算法介绍与分析
割的定义
一个割(S,T)由两个点集S,T组成. S+T = V s 属于 S. t 属于 T. 提出割的定义,是为后面的证明作铺垫.
结论2(点集总流量为零)
不包含s和t的点集,于它相关联的边上的流量之 和为0. 证明: f(X,V) = [ f ( x , y ) ]
x X y Y
=
x X y Y
即:X中的任意一点与Y中的任意一点组成的所 有边上的流量之和.(边的方向为从X中的结点到 Y中的结点) c,r等函数都有类似的定义.(点集间的容量和、 点集间的残量网络容量和)
结论1
1.f(X,X) = 0 (由流量反对称性) 2. f(X,Y) = -f(Y,X) (有流量反对称性) 3.f(X ∪ Y,Z) = f(X,Z) + f(Y,Z) (显然) 4.f(X,Y ∪ Z) = f(X,Y) + f(X,Z) (显然)
(0,4)
t
(0,2)
大致的思路:从源点出发, 逐步推进。 称当前状态下不满足流量 平衡的结点为“溢出的结 点”.(对于结点u,f(V,u) > 0) 令e(u) = f(V,u),称为u点的 赢余,直观地描述,就是 “流入的比流出的多多 少”。e(v1)=4,e(v2)=3。 不断将溢出的结点中的赢 余往后继点推进,直到赢余 都聚集在t.
s
(4,4) (0,3)
(2,2) v1 v2
(2,4) (2,2) t
一个简单的 例子.网络可 以被想象成 一些输水的 管道.括号内 右边的数字 表示管道的 容量,左边的 数字表示这 条管道的当 前流量.
网络流的三个性质
1、容量限制: f[u,v]<=c[u,v] 2、反对称性:f[u,v] = - f[v,u] 3、流量平衡: 对于不是源点也不是汇点的 任意结点,流入该结点的流量和等于流出该 结点的流量和。 结合反对称性,流量平衡也可以写成:
从一道题目的解法试谈网络流的构造与算法
从一道题目的解法试谈网络流的构造与算法福建师大附中江鹏1. 引论A. 对网络流算法的认识网络流算法是一种高效实用的算法,相对于其它图论算法来说,模型更加复杂,编程复杂度也更高,但是它综合了图论中的其它一些算法(如最短路径),因而适用范围也更广,经常能够很好地解决一些搜索与动态规划无法解决的,看似NP的问题。
B. 具体问题的应用网络流在具体问题中的应用,最具挑战性的部分是模型的构造。
这没用现成的模式可以套用,需要对各种网络流的性质了如指掌(比如点有容量、容量有上下限、多重边等等),并且归纳总结一些经验,发挥我们的创造性。
2. 例题分析【问题1】项目发展规划(Develop)Macrosoft®公司准备制定一份未来的发展规划。
公司各部门提出的发展项目汇总成了一张规划表,该表包含了许多项目。
对于每个项目,规划表中都给出了它所需的投资或预计的盈利。
由于某些项目的实施必须依赖于其它项目的开发成果,所以如果要实施这个项目的话,它所依赖的项目也是必不可少的。
现在请你担任Macrosoft®公司的总裁,从这些项目中挑选出一部分,使你的公司获得最大的净利润。
●输入输入文件包括项目的数量N,每个项目的预算Ci和它所依赖的项目集合Pi。
格式如下:第1行是N;接下来的第i行每行表示第i个项目的信息。
每行的第一个数是Ci,正数表示盈利,负数表示投资。
剩下的数是项目i所依赖的项目的编号。
每行相邻的两个数之间用一个或多个空格隔开。
●输出第1行是公司的最大净利润。
接着是获得最大净利润的项目选择方案。
若有多个方案,则输出挑选项目最少的一个方案。
每行一个数,表示选择的项目的编号,所有项目按从小到大的顺序输出。
●数据限制0≤N≤1000-1000000≤Ci≤1000000●输入输出范例【分析解答】1.抽象原题(图论模型)给定包含N个顶点的有向图G =(V, E),每个顶点代表一个项目,顶点有一权值Ci表示项目的预算。
图论中的网络流问题分析
图论中的网络流问题分析图论是研究图结构及其应用的数学分支,而网络流问题是图论中的一个重要研究方向。
网络流问题是指在一个有向图中,找到一条从源点到汇点的路径,并使路径上边的流量最大化或最小化的问题。
本文将对图论中的网络流问题进行详细的分析。
一、网络流问题的定义和基本概念网络流问题是在一个具有容量限制的有向图中,寻找一条从源点到汇点的路径,使得路径上经过的边的流量达到最大或最小。
网络流问题中的关键概念包括:1. 源点和汇点:在网络流图中,源点是流量的起点,汇点是流量的终点。
通常用字母s表示源点,用字母t表示汇点。
2. 容量:指边上能够通过的最大流量。
通常用c(u,v)表示边u到v的容量。
3. 流量:指在边上通过的实际流量。
通常用f(u,v)表示边u到v的流量。
4. 剩余容量:指边上剩余的可用容量,即容量减去已经通过的流量。
通常用r(u,v)表示边u到v的剩余容量,计算公式为r(u,v) = c(u,v) -f(u,v)。
5. 流网络:指在网络流图中,每个节点的流入流出的总流量相等的网络。
二、网络流问题的常见模型在实际应用中,网络流问题有多种不同的模型。
以下是几种常见的网络流问题模型:1. 最大流问题:在网络流图中,找到从源点到汇点的路径,使得路径上经过的边的流量之和达到最大。
2. 最小割问题:在网络流图中,找到一条从源点到汇点的路径,使得路径上的边的总容量最小。
最小割问题与最大流问题是等价的。
3. 最小费用最大流问题:在网络流图中,每条边都有一个单位流量的成本,找到从源点到汇点的路径,使得路径上经过的边的流量之和最大,且成本最小。
4. 多源多汇最大流问题:在网络流图中,存在多个源点和多个汇点,找到一条从任意一个源点到任意一个汇点的路径,使得路径上经过的边的流量之和达到最大。
三、常见的网络流问题算法为了解决网络流问题,人们发展出了许多有效的算法,在实际应用中得到广泛应用。
以下是几个常见的网络流问题算法:1. Ford-Fulkerson算法:是最早被提出的求解网络流问题的算法,通过不断寻找增广路径来更新流量,直到无法再找到增广路径为止。
最大流问题经典例题
最大流问题经典例题最大流问题是指在一个有向图中,从源点到汇点的最大流量是多少。
这个问题在现实生活中有很广泛的应用,比如网络通信中的数据传输、水管输水时的流量控制等。
下面我们来看一道经典的最大流问题的例题。
问题描述:给定一个有向图,其中每条边的容量都只会为1,求从源点到汇点的最大流量。
解题思路:这是一道非常基础的最大流问题,我们可以使用网络流的算法来解决。
下面,我将分几个步骤来阐述解题思路。
1. 构建网络流图首先,我们需要将原有的有向图转化为网络流图。
对于每条边,我们都要添加两条反向边,并将容量均设为1。
这样,我们就得到了一个新的有向图,它的任何一条边的容量都为1。
2. 使用Edmonds-Karp算法接下来,我们可以使用Edmonds-Karp算法,也叫增广路算法,来求出最大流量。
它是一种广度优先搜索的算法,的基本思想是:从源点开始,每次找一条容量不为0,且未被搜索过的路径,将路径上的边的容量减去该路径的最小容量,这个最小容量就是该路径的流量。
然后将路径中的正向边的流量加上这个流量,反向边的流量减去这个流量,依次迭代。
3. 输出结果最后,我们将算法得到的最大流量输出即可。
代码实现:以下是使用Python语言实现的最大流问题的代码:```def bfs(graph, start_node, end_node):visited = [False] * len(graph)queue = []queue.append(start_node)visited[start_node] = Truepred = [-1] * len(graph)while queue:curr_node = queue.pop(0)if curr_node == end_node:return True, predfor i, val in enumerate(graph[curr_node]):if not visited[i] and val > 0:queue.append(i)visited[i] = Truepred[i] = curr_nodereturn False, []def edmonds_karp(graph, start_node, end_node):max_flow = 0while True:flow_found, pred = bfs(graph, start_node, end_node) if not flow_found:breakcurr_node = end_nodemin_flow = float('inf')while curr_node != start_node:prev_node = pred[curr_node]min_flow = min(min_flow,graph[prev_node][curr_node])curr_node = prev_nodecurr_node = end_nodewhile curr_node != start_node:prev_node = pred[curr_node]graph[prev_node][curr_node] -= min_flowgraph[curr_node][prev_node] += min_flowcurr_node = prev_nodemax_flow += min_flowreturn max_flowif __name__ == '__main__':graph = [[0, 1, 0, 1, 0],[0, 0, 1, 0, 1],[0, 0, 0, 1, 0],[0, 0, 0, 0, 1],[0, 0, 0, 0, 0]]start_node = 0end_node = 4max_flow = edmonds_karp(graph, start_node, end_node)print("The maximum flow in the network is:", max_flow) ```在这个例子中,我们构建了一个有向图,其中每条边的容量均为1。
网络流题目+题解
网络流建模汇总 by Edelweiss目录最大流 (4)《POJ 1149 PIGS》 (4)《POJ 1637 Sightseeing tour》 (8)《POJ 2391 Ombrophobic Bovines》 (9)《POJ 2699 The Maximum Number of Strong Kings》 (10)《POJ 3281 Dining》 (11)《JOJ 2453 Candy》 (11)《ZOJ 2760 How Many Shortest Path》 (12)《WOJ 1124 Football Coach》 (12)《SGU 326 Perspective》 (13)《SGU 438 The Glorious Karlutka River =)》 (14)《SPOJ 287 Smart Network Administrator》 (14)《SPOJ 962 Intergalactic Map》 (15)《小结》 (15)最小割 (15)《HOJ 2634 How to earn more》 (16)《HOJ 2713 Matrix1》 (16)《POJ 1815 Friendship》 (17)《ZOJ 2532 Internship》 (17)《Ural 1277 Cops and Thieves》 (18)《SPOJ 839 Optimal Marks》 (18)《SPOJ 1693 Coconuts》 (19)《Beijing Regional 2008 Problem A Destroying the bus stations》 (19)《小结》 (20)有上下界 (21)《POJ 2396 Budget》 (21)《小结》 (22)最小费用流 (22)《HOJ 2543 Stone IV》 (22)《HOJ 2715 Matrix3》 (23)《HOJ 2739 The Chinese Postman Problem》 (23)《POJ 3680 Intervals》 (24)《SPOJ 371 Boxes》 (24)《BASHU 2445 餐巾问题》 (25)《剪刀石头布》 (25)《小结》 (26)最大流《POJ 1149 PIGS》【题目大意】有M个猪圈,每个猪圈里初始时有若干头猪。
网络流算法
最大流算法
第1步,令x=(xij)是任意整数可行流,可能是零流,给s一个永 久标号(-, ∞)。 第2步(找增广路),如果所有标号都已经被检查,转到第4步。 找到一个标号但未检查的点i, 并做如下检查,
对每一个弧(i,j),如果xij<Cij, 且j未标号,则给j一个标号(+i, δ(j) ),其中, δ(j)=min{Cij-xij , δ(i) } 对每一个弧(j, i),如果xji>0,且j未标号,则给j一个标号(-i, δ(j) ),其中, δ(j)=min{xji , δ(i) }
定理1:对于已知的网络流图,设任意一可行流为f, 任意一割切为(U, W),必有:V(f) ≤ C(U, W)。 定理2:可行流f是最大流的充分必要条件是:f中不 存在可改进路。 定理3:整流定理。 如果网络中所有的弧的容量是整数,则存在整数值 的最大流。 定理4:最大流最小割定理。 最大流等于最小割,即max V(f) = min C(U, W)。
剩余图(残余网络)
剩余图G’=(V,E’) 流量网络G=(V,E)中,对于任意一条边(a,b),若 flow(a,b)<capacity(a,b) or 则(a,b)∈ E’ flow(b,a)>0
可以沿着a--->b 方向增广
剩余图的权值代表能沿边增广的大小
有 向 图 剩 余 图
DINIC算法演示:
3 源点 4 2 2
找到增广路路线, 2 (红色路线) 汇点 5
对增广路进行增广, 增广后退回到源点 3 2 汇点
找到增广路路线, (红色路线) 3 2 3 2 对增广路进行增广, 增广后退回到源点, 再无增广路线 汇点 1 汇点
网络流算法(NetworkFlow)
网络流算法(NetworkFlow)网络流算法,是指寻找网络流问题的解的算法,它是一类重要的组合优化问题,被广泛应用于计算机科学及工程领域。
网络流是个有向图,它模拟了许多实际问题,如输电方案、货物运输、油管输送和信息传输等。
网络流算法的目的是在给定的网络流中,尽可能地将流量从源点流向汇点,同时满足各个节点的容量约束和流量平衡约束。
本文将介绍网络流模型的构建和基本算法。
一、网络流模型的构建网络流模型是一个有向图G=(V,E),其中V表示节点集合,E表示边集合。
每条边都有一个容量c(e)表示其流量的最大值。
设源点为s,汇点为t,则网络流模型可以表示为一个三元组(N,s,t),即:N=(V,E) s∈V t∈V s≠t在网络流模型中,源点始终是起点,汇点始终是终点。
我们在模型中引入一个源汇节点s'和汇源节点t',并连接源点和汇点,得到源汇图G'=(V,E'),其中:E'=E∪{(s',s,c(s,t))}∪{(t,t',c(s,t))}即,在原图的基础上,加入两个新的虚拟节点s'和t',并连接到源点和汇点。
这样构造的网络流模型中,所有的节点都满足容量和流量平衡约束。
在网络流问题中,我们需要求解最大流或最小割,以满足约束条件,并且尽可能地提高网络的利用率。
二、网络流的基本概念和算法1. 流量和容量网络流图中,首先需要确定每条边的容量和流量。
流量指的是通过该边的流量大小,容量指的是该边能够承受的最大流量。
在网络流模型中,每条边的容量是一个正实数,而流量可以是任意实数。
流量和容量通常表示为f(e)和c(e)。
2. 割在网络流模型中,割是一种对源汇图做出的划分,其中源点s和汇点t被分为两个集合S和T。
网络流通过割的概念来定义障碍物,即对流量的限制。
在网络流图中,割C(S,T)是指将源点s和汇点t割成两部分的划分,C(S,T)满足:s∈S t∈T S∩T=∅根据割的定义,可将所有割分为最小割和最大割。
网络流算法介绍与分析
网络流算法介绍与分析网络流问题可以用于解决很多实际中的应用问题,比如交通流量优化、航空航线规划、电力网络规划等。
因此,网络流算法在实际应用中具有重要的意义。
最常用的最大流算法是Ford-Fulkerson算法,它基于增广路径的思想,通过不断寻找增广路径来增加流量,直至无法找到增广路径为止。
Ford-Fulkerson算法的时间复杂度为O(Ef),其中E是图中边的数量,f是最大流的流量。
Ford-Fulkerson算法还有一个重要的改进算法,即Edmonds-Karp算法。
Edmonds-Karp算法在Ford-Fulkerson算法的基础上加入了BFS遍历,以保证每次选择的增广路径是最短的路径。
这样可以保证算法的时间复杂度为O(V*E^2),其中V是图中顶点的数量,E是图中边的数量。
另一个重要的最大流算法是Dinic算法,它基于层次图和分层网络的概念,通过构建分层网络并使用DFS遍历的方式来寻找增广路径。
Dinic算法的时间复杂度为O(V^2*E),其中V是图中顶点的数量,E是图中边的数量。
Dinic算法比Edmonds-Karp算法效率更高。
最小割算法主要包括Ford-Fulkerson算法和Stoer-Wagner算法。
Ford-Fulkerson算法可以利用网络中的最大流来求解最小割问题,它的时间复杂度和最大流算法一样。
Stoer-Wagner算法是一个基于图的割的概念的算法,通过不断选择割最小的边来合并两个顶点集合,直至整个图只剩下一个顶点。
Stoer-Wagner算法的时间复杂度为O(V^3),其中V是图中顶点的数量。
以上介绍的只是网络流算法中的几个典型算法,实际上还有很多其他的网络流算法,比如Push-Relabel算法、Capacity Scaling算法等。
这些算法各自有其适用的场景和特点,可以根据具体的问题选择合适的算法。
总的来说,网络流算法是一类非常强大的图论算法,可以应用于各种实际问题的求解。
第11讲 网络流
输入格式:输入文件的第一行包含两个用空格隔开的整数N和M,其中2≤N≤3000,1≤M≤N-1,N为整个有线电视网的结点总数,M为用户终端的数量。第一个转播站即树的根结点编号为1,其他的转播站编号为2到N-M,用户终端编号为N-M+1到N。接下来的N-M行每行表示—个转播站的数据,第i+1行表示第i个转播站的数据,其格式如下:K A1 C1 A2 C2 … Ak CkK表示该转播站下接K个结点(转播站或用户),每个结点对应一对整数A与C,A表示结点编号,C表示从当前转播站传输信号到结点A的费用。最后一行依次表示所有用户为观看比赛而准备支付的钱数。输出格式:输出文件仅一行,包含一个整数,表示上述问题所要求的最大用户数。
输入输出格式
输入输出样例
1
PART ONE
题目背景什么是电阻?这个大家应该都知道。什么是电路?大家也应该知道。但是本题当中,电路的定义或许有点不同:电路都带有正、负极接点,正极在左,负极在右。具体地:电路分为以下几类:单独的一个1Ω电阻(及其两端的接点)是电路(虽然导线也可以被视为0Ω的电阻,但是单独的导线不是电路)如果A和B都是电路,设1,2,3是从左到右的三个接点,那么将A的正负极分别接在1与2上,将B的正负极分别接在2与3上,那么1到3的部分是电路,其中1为正极,3为负极。如果A和B都是电路,设1,2,3,2',3',1’是六个接点,其中1在2和3的左侧,2在2’的左侧,3在3’的左侧,2,和3,在1’的左侧,并且1与2,1与3,2’与1’,3’与1’间均连有导线, 那么将A的正负极分别接在2与2’上,将B的正负极分别接在3与3’上,那么1到1'的部分是电路,其中1为正极,1’为负极。现在给出一个电路,求它正负极之间的电阻。
信息学竞赛中的网络流问题与算法
信息学竞赛中的网络流问题与算法信息学竞赛中的网络流问题与算法在计算机科学中具有重要的地位和应用。
网络流问题是指在一个网络模型中,计算流量在网路中的传输情况,并求解最大流或最小割的问题。
本文将介绍网络流问题的基本概念、流网络的建模方法以及常用的网络流算法。
1. 网络流问题的基本概念网络流问题是图论中的一类重要问题,主要研究在有向图中从源点到汇点的最大流或最小割。
在一个网络模型中,节点表示交通枢纽或物流中转站,边表示路径或管道,边上的权值表示流量的限制。
通过计算网络中流量的分配情况,可以求得最大流或最小割的解。
2. 流网络的建模方法为了描述网络流问题,需要建立一个流网络模型。
在流网络模型中,节点表示网络中的交叉点或者站点,边表示网络中的路径或者道路,边上的权值表示流量的限制。
通过引入源点和汇点,将问题转化为从源点到汇点的最大流或最小割问题。
3. 常用的网络流算法3.1 Ford-Fulkerson算法Ford-Fulkerson算法是最经典的网络流算法之一,主要用于求解最大流问题。
该算法采用贪心的策略,不断在残量网络中寻找增广路径,并更新流量的分配情况,直到不存在增广路径为止。
最终,得到的流量即为最大流。
3.2 Edmonds-Karp算法Edmonds-Karp算法是Ford-Fulkerson算法的改进版本,通过利用广度优先搜索(BFS)来寻找增广路径,提高了算法的效率。
该算法在每次寻找增广路径时将优先选择最短路径,从而减少了搜索的次数。
3.3 Dinic算法Dinic算法是一种高效的网络流算法,主要用于求解多源汇点的最大流问题。
该算法基于分层图的思想,通过在残量网络中构建分层图,并使用多次的BFS来寻找增广路径,从而实现了较快的计算速度。
4. 网络流问题的应用网络流问题广泛应用于交通运输、通信网络、电力网络等领域。
在交通运输中,可以利用网络流算法求解最优的货物调度问题,有效提高运输效率和节约成本。
网络流概念及相关算法介绍
网络流概念及相关算法介绍引言实现Ford-Fulkerson的时间复杂度主要取决于如何寻找增加路径p。
Edmonds-Karp实现正是通过采用了广度优先的搜索策略得以使其复杂度达到O(V*E^2)。
由于这种算法的效率不很理想,我们在此不多着墨,而主要介绍下述push-relabel算法的思想。
五、一般性的push-relabel算法很多渐进意义下最优的算法都是采用了push-relabel算法的思想,而且很多其他的相关问题,比如最小费用流问题,也可以用这种方法很好的解决。
首先介绍的是一般性的push-relabel算法。
不同于Ford-Fulkerson方法在残留网络中寻找增加路径的方式,push-relabel算法在运行的过程中只关注某一个顶点以及它的相邻顶点,在这个过程中,它并不像Ford-Fulkerson方法保持着“流的保持”性质,而是以一个“先流”进行运作。
这个先流同样是一个V×V →R的函数,满足容量限制和斜对称性,同时,它对所有的u∈V-{s}满足f(V,u)>=0。
我们记e(u)=f(V,u)。
如果e(u)>0我们就说顶点u溢出。
为了步入正题,我们还需要介绍push-relabel算法引入的一个额外的高度函数。
设G=(V,E)是一个流网络,源点是s,汇点是t,f是G中的一个先流。
如果函数h:V→N满足h(s)=|V|,h(t)=0,而且对残留网络中所有的边(u,v)有h(u)<=h(v)+1,那么称h是一个高度函数。
正如其名称一样,push-relabel算法有两个基本操作:push和relabel。
一般性的push-relabel算法就是通过往复执行这两种操作完成的:GENERIC-PUSH-RELABEL(G)先流初始化while 存在可以执行的push或relabel操作选择一个可以执行的push或relabel操作执行。
网络流算法详解
v1 15 s 4 8 v2 3
12
v3 16
9
7 v4
2 5
t
6
图 1 网络流的一个例子
v1 10/15 s 4/4 5/8 0/3 v2
5/12 0/9 4/7 5/6
v3 9/16 0/2 v4 5/5 t
图 2 图 1 的一条流 f
v1 5 s 4 10 3 8
7 5 13 3
v3 9 2 v4
网络流算法详解
网 络 流 算 法 在 许 多 实 际 问 题 中 有 应 用 , 如 匹 配 问 题 , 著 名 的 Hall 婚 姻 定 理 。 这里不证明“最大流最小割定理” ,简单解释求最大流的 Ford-Fulkerson 算法。接下来分别 详述时间复杂度为 O(VE2)的 Edmonds-Karp 算法和时间复杂度为 O(V2E)的 Dinic 算法。至 于较新的预留推进算法就不介绍了,这个算法证明比较难,感兴趣的可以看看算法导论。 本文所用到的网络流如图 1,s 为原点,t 为汇点,边上的值表示边的容量 c(u,v),如 c(s,v1)=15,c(v1,v2)=8。流用符号 f(u,v)表示,如图 2,流的容量 f(s,v1)=10,f(v1,v2)=5。剩 余容量 cf (u,v)=c(u,v)-f(u,v)。在原剩余网络中找到一条流后,修改原网络边的剩余容量得到 剩余网络 Gf,如图 3 所示。注意剩余网络中有一些新添加的边即反向边的容量,为流的反 馈。在图 3 中,有 f(v1,v3)=5,那么有 f(v3,v1)=- f(v1,v3)=-5,然后 cf(v3,v1)=c(v3,v1)-f(v3,v1)=0-(5)=5。
△ f=3。
v1 5 s 4 10 3 8 v2 7 5 13 3 v4 v3 9 2 5 t 7
网络流例题详解
网络流例题详解typedef struct node{int v, w;struct node *nxt, *op;}NODE;NODE edg[MM]; = v;edg[idx].w = c;edg[idx].nxt = link[u];edg[idx].op = edg + idx + 1;link[u] = edg + idx;idx++;edg[idx].v = u;edg[idx].w = 0;edg[idx].nxt = link[v];edg[idx].op = edg + idx - 1;link[v] = edg + idx;}int Min(int a, int b){return a < b ? a : b;}int aug(int u, int flow){if (u == T) return flow;int l = flow; = v;edg[idx].wt = x;edg[idx].nxt = link[u];link[u] = edg + idx;idx++;edg[idx].v = u;edg[idx].wt = y;edg[idx].nxt = link[v];link[v] = edg + idx;idx++;}int bfs(){int u, v, w, tail, head;memset(h, -1, sizeof(h));que[0] = S;h[S] = 0;tail = head = 0;while (head <= tail){u = que[head++];for (NODE *p = link[u]; p; p = p->nxt){v = p->v;w = p->wt;if (h[v] == -1 && w > 0){h[v] = h[u] + 1;que[++tail] = v;}}}return h[T] != -1;}int dfs(int u, int flow){if (u == T){return flow;}int tmpf = 0;int v, w, f;for (NODE *p = link[u]; p; p = p->nxt){v = p->v;w = p->wt;if (h[v] == h[u] + 1 && w && tmpf < flow &&(f = dfs(v, Min(w, flow - tmpf)))){p->wt -= f;int t = p - edg;if (t % 2 == 0){edg[t+1].wt += f;}else{edg[t-1].wt += f;}tmpf += f;}}if (tmpf == 0) h[u] = -1;return tmpf;}void dinic(){int ans = 0;while(bfs()){ans += dfs(S, INF);}printf("%d\n", ans);}int main(){int i, j, a, b, d, f, N, F, D;scanf("%d%d%d", &N, &F, &D);S = 0;T = 2 * N + F + D + 1;idx = 0;for (i = S; i <= T; i++) link[i] = 0;for (i = 1; i <= F; i++){add(0, 2 * N + i, 1, 0);}for (i = 1; i <= D; i++){add(2 * N + F + i, T, 1, 0);}for (i = 1; i <= N; i++){scanf("%d%d", &f, &d);for (j = 1; j <= f; j++){scanf("%d", &a);add(2 * N + a, N + i, 1, 0);}A node u may be supplied with an amount s(u) >= 0 of power, may produce an amount 0 <= p(u) <= p max(u) of power, may consume an amount 0 <= c(u) <=min(s(u),c max(u)) of power, and may deliver an amount d(u)=s(u)+p(u)-c(u) of power. The following restrictions apply: c(u)=0 for any power station, p(u)=0 for any consumer, and p(u)=c(u)=0 for any dispatcher. There is at most one power transport line (u,v) from a node u to a node v in the net; it transports an amount 0 <= l(u,v) <= l max(u,v) of power delivered by u to v. Let Con=Σu c(u) be the power consumed in the net. The problem is to compute the maximum value of Con.An example is in figure 1. The label x/y of power station u shows that p(u)=x andp max(u)=y. The label x/y of consumer u shows that c(u)=x and c max(u)=y. The labelx/y of power transport line (u,v) shows that l(u,v)=x and l max(u,v)=y. The power consumed is Con=6. Notice that there are other possible states of the network but the value of Con cannot exceed 6.InputThere are several data sets in the input. Each data set encodes a power network. It starts with four integers: 0 <= n <= 100 (nodes), 0 <= np <= n (power stations), 0 <= nc <= n (consumers), and 0 <= m <= n^2 (power transport lines). Follow m data triplets (u,v)z, where u and v are node identifiers (starting from 0) and 0 <= z <= 1000 is the value of l max(u,v). Follow np doublets (u)z, where u is the identifier of a power station and 0 <= z <= 10000 is the value of p max(u). The data set ends with nc doublets (u)z, where u is the identifier of a consumer and 0 <= z <= 10000 is the value ofc max(u). All input numbers are integers. Except the (u,v)z triplets and the (u)z doublets, which do not contain white spaces, white spaces can occur freely in input. Input data terminate with an end of file and are correct.OutputFor each data set from the input, the program prints on the standard output the maximum amount of power that can be consumed in the corresponding network. Each result has an integral value and is printed from the beginning of a separate line. Sample Input2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)20 7 23 13 (0,0)1 (0,1)2 (0,2)5 (1,0)1 (1,2)8 (2,3)1 (2,4)7 (3,5)2 (3,6)5 (4,2)7 (4,3)5 (4,5)1 (6,0)5 (0)5 (1)2 (3)2 (4)1 (5)4Sample Output15 6HintThe sample input contains two data sets. The first data set encodes a network with 2 nodes, power station 0 with pmax(0)=15 and consumer 1 with cmax(1)=20, and 2 power transport lines with lmax(0,1)=20 and lmax(1,0)=10. The maximum value of Con is 15. The second data set encodes the network from figure 1.题目大意:有一个能量网,要通过发电站,运电网络,发送到用户那里去。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从一道题目的解法试谈网络流的构造与算法
福建师大附中江鹏
1. 引论
A. 对网络流算法的认识
网络流算法是一种高效实用的算法,相对于其它图论算法来说,模型更加复杂,编程复杂度也更高,但是它综合了图论中的其它一些算法(如最短路径),因而适用范围也更广,经常能够很好地解决一些搜索与动态规划无法解决的,看似NP的问题。
B. 具体问题的应用
网络流在具体问题中的应用,最具挑战性的部分是模型的构造。
这没用现成的模式可以套用,需要对各种网络流的性质了如指掌(比如点有容量、容量有上下限、多重边等等),并且归纳总结一些经验,发挥我们的创造性。
2. 例题分析
【问题1】项目发展规划(Develop)
Macrosoft®公司准备制定一份未来的发展规划。
公司各部门提出的发展项目汇总成了一张规划表,该表包含了许多项目。
对于每个项目,规划表中都给出了它所需的投资或预计的盈利。
由于某些项目的实施必须依赖于其它项目的开发成果,所以如果要实施这个项目的话,它所依赖的项目也是必不可少的。
现在请你担任Macrosoft®公司的总裁,从这些项目中挑选出一部分,使你的公司获得最大的净利润。
●输入
输入文件包括项目的数量N,每个项目的预算Ci和它所依赖的项目集合Pi。
格式如下:第1行是N;
接下来的第i行每行表示第i个项目的信息。
每行的第一个数是Ci,正数表示盈利,负数表示投资。
剩下的数是项目i所依赖的项目的编号。
每行相邻的两个数之间用一个或多个空格隔开。
●输出
第1行是公司的最大净利润。
接着是获得最大净利润的项目选择方案。
若有多个方案,则输出挑选项目最少的一个方案。
每行一个数,表示选择的项目的编号,所有项目按从小到大的顺序输出。
●数据限制
0≤N≤1000
-1000000≤Ci≤1000000
●输入输出范例
【分析解答】
1.抽象原题(图论模型)
给定包含N个顶点的有向图G =(V, E),每个顶点代表一个项目,顶点有一权值Ci表示项目的预算。
用有向边来表示项目间的依赖关系,从u指向v的有向边表示项目u依赖于项目v。
问题:求顶点集的一个子集V’,满足对任意有向边〈u,v〉∈E,若u∈V’,则v∈V’,使得V’中所有顶点的权值之和最大。
-4 2 -3
2.搜索
枚举V的所有符合条件的子集,时间复杂度O(2n),指数级。
无论如何剪枝优化,也摆脱不了非多项式。
3.动态规划
本题的结构是有向无环图,而非树形结构,不适合动态规划。
如果一定要做,实质类似于搜索,由于状态数量众多,仍是指数级的时间复杂度。
4.网络流
流网络的构造方法:
建立N顶点代表N个项目,另外增加源s与汇t。
若项目i必须依赖于项目j,则从顶点i向顶点j引一条容量为无穷大的弧。
对于每个项目i,若它的预算C为正(盈利),则从源s向顶点i引一条容量为C的边;若它的预算C为负(投资),则从顶点i向汇t引一条容量为-C的边。
求这个网络的最小割(S, T),设其容量C(S,T)=F。
设R为所有盈利项目的预算之和(净利润上界),那么R-F就是最大净利润;S中的顶点就表示最优方案所选择的项目。
最小割:S={s,1,2,3,4,6};T={5,t}
C(S,T)=5净利润R- C(S,T)=8-5=3
证明算法的正确性:
●建立项目选择方案与流网络的割(S,T)的一一对应关系:
任意一个项目选择方案都可以对应网络中的一个割(S,T),S={s}+{所有选择的项目},T=V-S。
对于任意一个不满足依赖关系的项目选择方案,其对应的割有以下特点:
存在一条容量为+∞弧〈u,v〉,u属于S而v属于T。
这时割的容量是无穷大,显然不可能是网络的最小割。
●对于任意一个割(S,T),如果其对应一个符合条件的方案,它的净利润是R-C(S,T)。
导致实
际净利润小于上届R的原因有:
1.未选取盈利项目i,即顶点i包含在T中,那么存在一条从源s至顶点i的容量为Ci的弧2.选取投资项目i,即顶点i包含在S中,那么存在一条从顶点i至汇的容量为-Ci的弧C(S,T)就是上述两种弧的容量之和。
综上所述,割的容量越小,方案的净利润就越大。
●最小割的求法:
根据最大流最小割定理,网络的最小割可以通过最大流的方法求得。
本题解题的关键在于流网络数学模型的建立。
本题建模的独到之处在于:以前的网络流问题通常使用流量表示解答方案,而本题使用割表示解答方案,并充分利用了割的性质,流只是求得最小割的手段。
这为我们开辟了一条构造网络流解决问题的新思路。
初看这个问题,要把它和网络流联系起来,有相当的难度。
必须熟练地掌握流网络的各种性质,经过反复的类比尝试,才能发现它们之间的共性。
【联想思考】
作为本题的一个衍生,给每个项目估计一个完成时间,并假设公司同时只能进行一个项目。
现在的问题是:如何选择一些能在给定时间内完成的项目,使得公司得到最大收益。
这个问题我至今还没有找到有效算法,希望有兴趣的同学来共同研究。
3. 编程技巧
◆数据结构:邻接表
◆直接表示原问题
优点:节省空间
缺点:编程复杂度大,不具有通用性。