资源描述:
《论文--“分层图思想”及其在信息学竞赛中的应用》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、“分层图思想”及其在信息学竞赛中的应用【摘要】本文通过对几道信息学竞赛题的解决,提出了一种解决问题的建模思想——分层图思想。该思想通过挖掘问题性质,将原问题抽象得出的图复制为若干层并连接形成更大的图,使本来难以用数学语言表达得图论模型变得简明严谨,为进一步解决问题打下了良好的基础。【关键字】分层图思想 图论 数学模型 最短路 信息学竞赛【正文】1引论人们在借助计算机解决一个实际问题时,无非就是详细地告诉计算机应该怎么做,使它能通过人们给定的输入得到人们想要的输出。由于一般的计算机只能处理数字信号,所以只有把实际问题转化为数学问题,计算机才能帮助我们。这一步就是建立数学模型。数学模型的建
2、立在通过计算机解决问题的过程中非常重要。它把计算机无法理解的问题加以转化,使一切事物量化,最终变为只含数学过程的问题。它是人脑与计算机沟通的桥梁。不仅如此,数学模型的好坏直接影响着人与计算机之间的信息交流,影响着计算机对问题的“理解”。好的数学模型能够抓住问题的本质,表述简捷明了,易于人们找到有效的解决方法,并通过编制程序的方式将解决方法告诉计算机;相反,对于同一个问题,如果数学模型不能抓住问题本质,人们就可能无法解决问题,或者找不到有效的方法,更不用提告诉计算机如何做了。由于建立数学模型是为了解决问题,所以人们在做这项工作时往往希望把问题归结为已经很好解决的经典问题或若干这样问题的有
3、机结合。这样,只要应用前人的研究成果就可以了。比如,排序、求图的单源最短路、网络流等等都是经典问题,前人不仅给出一般解法,而且对各种特殊情况和变形作了深入的研究。但事情并不总像人们希望的那样,有的问题即使可以归结为已有问题,在其中加入一些干扰因素后,原有性质就会发生改变,原来建立起的数学模型难以再用严谨的数学语言表达。这样问题中的部分图论问题可以用本文提出的“分层图思想”解决。该思想注重对原问题性质的挖掘,通过对原问题数学模型的扩展,将干扰因素融入新的数学模型之中,恢复了模型的严谨性,进而与已解决问题产生联系,得到有效算法。2提出“分层图思想”2.1一个问题的解决例题1:拯救大兵瑞恩选
4、自1999年国际信息学奥林匹克中国国家队组队选拔赛,题目全文见参考文献[1]问题简述:有一个长方形的迷宫,被分成了N行M列,共N*M个单元。两个相邻(有公共边)的单元之间可以互通,或有一扇锁着的门,或者存在一堵不可逾越的墙。迷宫中一些单元存放着钥匙,且所有的门被分为P类,打开同类门的钥匙相同,打开不同类门的钥匙不同。(如右图)要求从迷宫左上角走到右下角营救大兵瑞恩,每从一个单元移动到相邻单元记为一步。只有拿到钥匙,才能打开相应的门。试求最少步数。此题的标准解法是动态规划:以拿到的钥匙种类划分阶段,时间复杂度为O(2PN2)。(详见[1])其实此算法可以用“分层图思想”做出更简明的解释。
5、首先忽略钥匙和门,那么问题就是在一个给定隐式图中求一条最短路,数学模型很简单:已知图G,其中顶点与地图中的单元一一对应。当且仅当两格相邻且之间无墙时,他们对应的顶点间有一条边(如右图)。求从左上角对应顶点到右下角对应顶点最短路长度。加入钥匙和门的因素,则所求最短路有了一个限制因素,即只有先到存在钥匙的格子,才能通过相应的门。换句话说,通过图中某些边是有条件的。所以不能再简单地求最短路了,而是要考虑何时那些边能通过,何时不能通过。这就要记录拿到了哪些钥匙。此时,我们需对原模型进行改造:将原图G复制2P个,记为G(s1,s2,…,sP),其中si=0表示未拿到第i类钥匙,si=1表示已拿到
6、第i类钥匙,i=1,2,…,P。对每个图G(s1,s2,…,sP),若si=0,则将所有i类门对应的边去掉,因为没有此类钥匙不能通过此类门。再将其余所有边改为双向弧,权为1。对所有顶点对(u,v)及整数i,若它满足lu、v分别在G(s1,s2,…,si-1,0,si+1,…,sP)、G(s1,s2,…,si-1,1,si+1,…,sP)中,且均对应(x,y)单元l(x,y)格中有i类钥匙则添加有向弧uv,权为0,表示走到(x,y)单元就可以由未拿到第i类钥匙转变为已拿到第i类钥匙,而不需要消耗额外的步数。这样,这2P个图被连成了一个2P“层”的有向图(如下图)。问题转化为求由该图G(0
7、,0,…,0)层表示左上角的顶点到每一层表示右下角的顶点的最短路长度的最小值。注意,这里需要求的不是到G(1,1,…,1)层表示右下角的顶点的最短路长度,因为要成功营救大兵瑞恩很可能并不需要拿全所有的钥匙。1.1小结可见,用此思想可以建立起更简洁、严谨的数学模型,进而很容易得到有效算法。重要的是,新建立的图有一些很好的性质:由于层是由复制得到的,所以所有层都非常相似,以至于我们只要在逻辑上分出层的概念即可,根本不用在程序中进行新层的存储,甚至几