① 鍙傚姞ACM澶ц禌搴旇ュ嗳澶囧摢浜涜剧▼锛
璇剧▼锛
锛1锛夊熀链绠楁硶: 浜屽垎,鍒嗘不锛岃椽蹇
锛2锛 绂绘暎鏁板︾绘暎鏁板﹀姩镐佽勫垝
锛3锛 鎼灭储绠楁硶锛氭繁搴︿紭鍏 鎼灭储锛屽箍搴︿紭鍏堟悳A*绠楁硶 锛岄樋灏旀硶璐濆斿壀鏋
锛4锛夋暟鎹缁撴瀯:绾挎垫爲, 镙戠姸鏁扮粍锛屽苟镆ラ泦,Trie锲
锛5锛夊浘璁洪梾棰桡细链灏忕敓鎴愭爲 链鐭璺 寮鸿繛阃氩垎閲忋佹ˉ鍜屽壊镣
锛6锛夌绣缁沧祦绠楁硶锛氩熀链镄勭绣缁沧祦绠楁硶锛娈inic绠楁硶锛屽甫涓娄笅鐣岀殑缃戠粶娴侊纴链灏忚垂鐢ㄦ祦
锛7锛夎$畻鍑犱綍锛氱嚎涓庣嚎姹备氦锛岀嚎涓庨溃姹备氦锛屾眰鍑稿寘锛屽崐骞抽溃姹备氦绛
锛8锛 绂绘暎鏁板︼纴楂樼瓑鏁板︼纴绾挎т唬鏁帮纴鍒濈瓑鏁拌猴纴璁$畻鍑犱綍
锛9锛夎$畻链轰笓涓氲嫳璇
锛10锛塁++锛涘熀纭镄勯掑綊銆佹灇涓剧畻娉
1.鍙傝禌阒熶紞链澶氱敱涓夊悕鍙傝禌阒熷憳缁勬垚銆
2.绔炶禌涓锻介10棰桦乏鍙筹纴璇曢樻弿杩颁负鑻辨枃锛屾瘆璧涙椂闂翠负5涓灏忔椂锛屽墠锲涗釜灏忔椂鍙浠ュ疄镞剁湅鍒版帓钖嶏纴链钖庝竴灏忔椂灏佹滐纴镞犳硶鐪嫔埌鎺掑悕銆
3.绔炶禌鍙浠ヤ娇鐢ㄧ殑璇瑷锛钦ava, C, C++, Kotlin 鍜 Python銆
4.閲岖偣钥冨疗阃夋坠镄勭畻娉曞拰绋嫔簭璁捐¤兘锷涳纴涓嶈冨疗瀹为檯宸ョ▼涓甯哥敤镄勭郴缁熺紪绋嬶纴澶氱嚎绋嬬紪绋嬬瓑绛夛绂
5.阃夋坠鍙鎼哄甫浠讳綍闱炵数瀛愮被璧勬枡锛屽寘𨰾涔︾睄鍜屾墦鍗板嚭𨱒ョ殑绋嫔簭绛夛纴閮ㄥ垎璧涘尯浼氩归夋坠鎼哄甫镄勭焊璐ㄨ祫鏂椤仛闄愬埗銆
6.璇勫旇礋璐e皢缁撴灉锛堟g‘鎴栧嚭阌欑殑绫诲瀷锛夐氲繃缃戠粶灏藉揩杩斿洖缁欓夋坠锛岄櫎姝や箣澶栦笉鎻愪緵浠讳綍棰濆栧府锷╋绂
7.姣忎釜棰樼洰瀵瑰簲涓绉嶉滆壊镄勬皵鐞冿纴阃氲繃璇ラ樼洰镄勯槦浼崭细寰楀埌瀵瑰簲棰滆壊姘旂悆銆傛疮阆挞樼洰绗涓鏀瑙e喅鎺夊畠镄勯槦杩树细棰濆栬幏寰椾竴涓钬淔IRST PROBLEM SOLVED钬濈殑姘旂悆銆
鍙傝冭祫鏂欙细鍖椾含澶у︽殇链熻撅细ACM/ICPC绔炶禌璁缁
锏惧害锏剧-ACM锲介檯澶у︾敓绋嫔簭璁捐$珵璧
② 高分:网络流问题
一、引言
网络流算法是一种高效实用的算法,相对于其它图论算法来说,它的模型更加复杂,编程复杂度也更高。但是它综合了图论中的其它一些算法(如最短路径、宽度搜索算法),因而适用范围也更广,经常能够很好地解决一些搜索与动态规划无法解决的非np问题。
网络流在具体问题中的应用,最具挑战性的部分是模型的构造,它没用现成的模式可以套用,需要我们对各种网络流的性质了如指掌(比如点有容量、容量有上下限、多重边等等),根据具体的问题发挥我们的创造性。一道问题经常可以建立多种模型,不同的模型对问题的解决效率的影响也是不同的,本文通过实例探讨如何确定适当的模型,提高网络流算法的效率。
二、网络流算法时间效率
当我们确定问题可以使用最大流算法求解后,就根据常用的ford-fulkerson标号法求解;而最小(大)费用最大流问题也可用类似标号法的对偶算法解题。ford-fulkerson标号法的运行时间为o(ve2),对偶法求最小费用流的运行时间大约为o(v3e2)。
显然,影响网络流算法的时间效率的因素主要是网络中顶点的数目与边的数目。这二个因素之间不是相互独立的,而是相互联系,矛盾而统一的。在构造网络模型中,有时,实现了某个因素的优化,另外一个因素也随之得到了优化;有时,实现某个因素的优化却要以增大另一因素为代价。因此,我们在具体问题的解决中,要坚持"全局观",实现二者的平衡。
三、模型的优化与选择
(一)减少模型的顶点数与边数,优化模型
如果能根据问题的一些特殊性质,减少网络模型中的顶点的数目和边的数目,则可以大大提高算法的效率。
例1:最少皇后控制
在国际象棋中,皇后能向八个方向攻击(如图1(a)所示,图中黑点格子为皇后的位置,标有k的格子为皇后可攻击到的格子)。现在给定一个m*n(n、m均不大于于50)的棋盘,棋盘上某些格子有障碍。每个皇后被放置在无障碍的格子中,它就控制了这个格子,除此,它可以从它能攻击到的最多8个格子中选一个格子来控制,如图1(b)所示,标号为1的格子被一个皇后所控制。
请你编一程序,计算出至少有多少个皇后才能完全控制整个棋盘。
图1(a) 图1(b)
输入格式:
输入文件的第一行有两个整数m和n,表示棋盘的行数与列数。接下来m行n列为一个字符矩阵,用''.''号表示空白的格子,''x''表示有障碍的格子。
输出格式:
输出文件的第一行仅有一个数s,表示需要皇后的数目。
sample input
3 4
x...
x.x.
.x..
sample ouput
5
问题分析]
如果本问题用简单的搜索来做,由于题目给的棋盘很大,搜索算法很难在短时间内出解。由于一个皇后在棋盘最多只能控制两个格子,因此最少需要的皇后数目的下界为[n*m/2]。要使得皇后数目最少,必定是尽量多的皇后控制两个格子。如果我们在每两个能相互攻击到的格子之间加上一条有向弧,则问题很类似于二分图的最大匹配问题。
[模型一]
1. 将每个非障碍的格子按行优先编号(0~m*n-1)。
2. 将上述的每个格子i折成两个格子i''和i'''',作为网络模型中的顶点。
3. 若格子i可以攻击到格子j且i<j,则在模型中顶点i''到j''''之间加上一条有向弧,容量为1。
4. 增加一个源点s,从s点向所有顶点i''添上一条弧;增加一个汇点t,从所有顶点j''''到t添上一条弧,容量均为1。
图1(b)所示的棋盘,对应的模型为:
图2
显然,任一解对应于以上模型的一个最大匹配。且最大匹配中,匹配数必定是偶数。因此至少需要的马匹数为m*n-障碍数-最大匹配数/2。
[模型二]
如果我们将棋盘涂成黑白相间的格子,则某皇后控制的两个格子一定是一个是黑格,另一个是白格(如图3),不妨设这两个格子中皇后在白格子上。于是,我们将n*m个格子分成两部分白格与黑格。因此我们可以将模型一优化为:
图3
1.将棋盘中的所有格子分成两个部分,对所有的格子进行编号,每个白格与它能攻击到的黑格之间(障碍除外)添上一条从白格到黑格的弧,构成一个二分图。
2.增加一个源点s,从s点向所有非障碍的白格添上一条弧;增加一个汇点t,从所有非障碍的黑格到t添上一条弧。
3.设置所有的弧的流量为1。
图1(b)所示的棋盘,对应的模型为:
图4
[两种模型的比较]
显然,模型二的顶点数与边数大致是模型一的一半。下面是在bp环境下两种模型的时间效率比较(p166/32m):
模型一 模型二
可扩展性 不易打印出一种解 容易打印出一种解
模型二正是根据问题的特殊性(即马的走法),将网格中的格点分成白与黑两类,且规定马只能从白格跳到黑格,从而避免将每个格点折分成两个点,减少模型的顶点数,同时也大大减少了边的数目。达到了很好的优化效果。
(二)综合各种模型的优点,智能选择模型
有时,同一问题的各种模型各有特色,各有利弊。这种情况下,我们就要综合考虑各种模型的优缺点,根据测试数据智能地选择问题的模型。
例2火星探测器(ioi97)
有一个登陆舱(pod),里边装有许多障碍物探测车(mev),将在火星表面着陆。着陆后,探测车离开登陆舱向相距不远的先期到达的传送器(transmitter)移动,mev一边移动,一边采集岩石(rock)标品,岩石由第一个访问到它的mev所采集,每块岩石只能被采集一次。但是这之后,其他mev可以从该处通过。探测车mev不能通过有障碍的地面。
本题限定探测车mev只能沿着格子向南或向东从登陆处向传送器transmitter移动,允许多个探测车mev在同一时间占据同一位置。
任务:计算出所有探测车的移动途径,使其送到传送器的岩石标本的数量最多,且使得所有的探测车都必须到达传送器。
输入:
火星表面上的登陆舱pod和传送器之间的位置用网络p和q表示,登陆舱pod的位置为(1,1)点,传送器的位置在(p,q)点。
火星上的不同表面用三种不同的数字符号来表示:
0代表平坦无障碍
1代表障碍
2代表石块。
输入文件的组成如下:
numberofvehicles
p
q
(x1y1)(x2y1)(x3,y1)…(xp-1y1)(xpy1)
(x1y2)(x2y2)(x3,y2)…(xp-1y1)(xpy2)
(x1y3)(x2y3)(x3,y3)…(xp-1y3)(xpy3)
…
(x1yq-1)(x2yq-1)(x3,yq-1)…(xp-1yq-1)(xpyq-1)
(x1yq)(x2yq)(x3,yq)…(xp-1yq)(xpyq)
p和q是网络的大小;numberofvehicles是小于1000的整数,表示由登陆舱pod所开出的探测车的个数。共有q行数据,每行表示火星表面的一组数据,p和q都不超过128。
[模型一]
很自然我们以登陆舱的位置为源点,传送器的位置为汇点。同时某块岩石由第一个访问到它的mev所采集,每块岩石只能被采集一次。但是这之后,其他mev可以从该处通过,且允许多个探测车mev在同一时间占据同一位置。因此我们将地图中的每个点分成两个点,即(x,y)à(x,y,0)和(x,y,1)。具体的描述一个火星地图的网络模型构造如下:
1. 将网格中的每个非障碍点分成(x,y)两个点(x,y,0)和(x,y,1),其中源点s = v(1, 1, 0),汇点t = v(maxx, maxy, 1)。
2. 在以上顶点中添加以下三种类型的边e1,e2,e3,相应地容量和费用分别记为c1、c2、c3以及w1、w2、w3:
u e1 = v(x, y, 0) -> v(x, y, 1),c1 = maxint,w1 = 0。
u e2 = v(x, y, 0) -> v(x, y, 1),c2 = 1,w2 = -1(这里要求(x, y)必须是矿石)
u e3 = v(x, y, 1) -> v(x'', y'', 0),c3 = maxint,w3 = 0.
其中x''=x+1 y''=y 或x''=x y''=y+1,1 <= x'' <= maxx,1 <= y'' <= maxy,且(x'' y'')非障碍。
从以上模型中可以看出,在构造的过程中,将地图上的一个点"拆"成了网络的两个节点。添加e1型边使得每个点可以被多次访问,而添加e2型边使得某点上的矿石对于这个网络,从s到t的一条路径可以看作是一辆探测车的行动路线。路径费用就是探测车搜集到的矿石的数目。对于网络g求流量为numberofvehicles的固定最小费用流,可以得到问题的解。
[模型二]
事实上,如果我们只考虑这numberofvehicles辆车中每辆车分别依次装上哪些矿石。则每辆车经过的矿石就是一条流,因此我们以网格中的矿石为网络的顶点建立以下的网络流模型。
1. 将网格中的每个起点(网格左上角)能到达,且能从它能到达终点(右下角)的矿石 (x,y)点分成左点(x,y,0)和右点(x,y,1)两个点,并添加源点s和汇点t。
2. 在以上顶点中添加以下五种类型的边e1,e2,e3,相应地容量和费用分别记为c1、c2、c3以及w1、w2、w3:
u e1 = v(x, y, 0) -> v(x, y, 1),c1 = 1,w1 = -1。
u e2 = v(x, y, 1) -> v(x'', y'', 0),c2 = 1,w2 = 0(矿石点(x, y)可到达矿石点(x'',y''))。
u e3 = s -> v(x, y, 0),c3 = 1,w3 = 0。
u e4 = v(x, y, 1)->t,c4 = 1,w4 = 0。
u e5=s->t,c5=maxint,w5=0。
由于每个石块被折成两个点,且容量为1,就保证了每个石块只被取走一次,同时取走一块石块就得到-1的费用。因此对以上模型,我们求流量为numberofvehicles的最小费用流,就可得到解。
[两种模型的比较]
1.模型一以网格为顶点,模型二以矿石为顶点,因此在顶点个数上模型二明显优于模型一,对于一些矿石比较稀疏,而网格又比较大的数据,模型二的效率要比模型一来得高。且只要矿石的个数不超过一定数目,模型二可以处理p,q很大的数据,而模型一却不行。
2.模型一中边的数目最多为3*p*q,而模型二中边的数目最坏情况下大约为p*q*(p+1)*(q+1)/4-p*q。因此在这个问题中,若对于一些矿石比较密集且网格又比较大的数据,模型二的边数将大大超过模型一,从而使得时间效率大大低于模型一。
下面是网格中都是矿石的情况比较(piii700/128m ,bp7.0保护模式):
numberofvehicles=10 模型一 模型二
通过以上数据,可知对于p,q不超过60的情况,模型一都能在10秒内出解。而模型二则对于p、q=30的最坏情况下速度就很慢了,且p、q超过30后就出现内存溢出情况,而无法解决。
因此,对于本题,以上两种模型各有利弊,我们可根据测试数据中矿石稀疏程度来决定建立什么样的模型。若矿石比较稀疏,则可以考虑用建立如模型二的网络模型;若矿石比较密集则建立模型一所示网络模型。然后,再应用求最小费用最大流算法求解。对于p,q>60,且矿石比较多情况下,两种模型的网络流算法都无法求解。在实际的应用中问题经常都只要求近似解,此时还可用综合一些其它算法来求解。
四、结束语
综上所述,网络流算法中模型的优化是网络流算法提高效率的根本。我们要根据实际问题,从减少顶点及边的角度综合考虑如何对模型进行优化,选择适当的模型,以提高算法的效率。对于有些题目,解题的各种模型各有优劣时,还可通过程序自动分析测试数据,以决定何种情况下采用何种模型,充分发挥各种模型的优点,以达到优化程序效率的目的。