最短路模型的构建与求解方法方案曹利国教案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最短路模型的构建与求解方法教案
长沙市一中曹利国
课题:最短路模型的构建与求解方法
重点:最短路问题的求解方法
难点:最短路问题的模型构建方法
过程:
一、最短路问题的原型
(1)单源最短路问题
问题描述:用带权的有向图表示一个交通运输网,图中:
顶点——表示城市
边——表示城市间的交通联系
权——表示此线路的长度或沿此线路运输所花的时间或费用等问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径—最短路径用n表示图中节点的个数,
用g : [1..n,1..n]of integer储存个个顶点之间的距离,用vis : array[1..n]of boolean 储存个点的访问情况。用disk : array[1..n]of integer储存起点到其他各点的最短距离,[
初始化:disk[1..n]= +∞,disk[from]=0,vis[1..n]=false。
Repeat
找到一个未访问(vis[i]=false)且在所有未访问的节点中最短距离最小(disk[i]
≤disk[k] k∈vis[k]=false)的节点I;
用找到的节点I更新其他节点的最短距离(if disk[i]+g[I,j] disk[j]=disk[i]+g[I,j]) Until 所有节点都扩张过了。(2)任意顶点对之间的最短路问题 求解方法:Floyed算法。 ➢方法一:每次以一个顶点为源点,重复执行Dijkstra算法n次---T(n)=O(n³) ➢方法二:弗洛伊德(Floyd)算法,其算法思想:逐个顶点试探法。 具体步骤: ❖初始时设置一个n阶方阵,令其对角线元素为0,若存在弧 ❖所有顶点试探完毕,算法结束二、模型构建方法与问题分析《过河问题》。一个人带了一只狼、一只兔子和一棵白菜想要过河。河上有一只独木船,每次除了人以外,只能带 一样东西。另外如果人不在旁时狼就要吃兔子,兔子就要吃白菜。问应该怎样安排过河,才能做到既把所有东西都带过河,在河上来回的次数又最少? .分析: (一)构图 (1)图的节点 对于左岸的情况,我们可以用集合表示。这样一共会有24=16种状态:[人、狼、兔、菜] [人、狼、兔] [人、狼、菜] [人、兔、菜][狼、兔、菜][人、狼] [人、兔] [人、菜] [狼、兔][狼、菜] [兔、菜][人] [狼][兔] [菜] [ ] 这其中有狼吃兔子、兔子吃菜的情况的有: [狼、兔、菜],[人、狼],[人、菜],[狼、兔],[兔、菜],[人] 共6种情况。将他们删掉后就剩下10个集合了。将这10个集合看成我们的图中的10个节点。 (2)图的边与权 这10个节点,若是一个节点的情况可以通过一次渡河得到另一个节点的情况,就在这两个节点之间连一条权值为1的无向边。构建后的图论模型如下: (二)问题转化:构建好图论模型后,问题转化成了求[人、狼、兔、菜] 到[ ] 的最短路径了。 问题B:最优乘车(NOI97试题) 问题描述: H城是一个旅游胜地,每年都有成千上万的人前来观光。为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴士线路。每条单程巴士线路从某个巴士站出发,依次途经若干个巴士站,最终到达终点巴士站。 一名旅客最近到H城旅游,他很想去S公园游玩,但如果从他所在的饭店没有一路巴士可以直接到达S公园,则他可能要先乘某一路巴士坐几站,再下来换乘同一站台的另一路巴士, 这样换乘几次后到达S公园。 现在用整数1,2,……N 给H城的所有的巴士站编号,约定这名旅客所在饭店的巴士站编号为1,2,……S,公园巴士站的编号为N。 写一个程序,帮助这名旅客寻找一个最优乘车方案,使他在从饭店乘车到S公园的过程中换车的次数最少。 输入输出 输入文件是INPUT.TXT。文件的第一行有两个数字M和N(1<=M<=100 1 输出文件是OUTPUT.TXT,文件只有一行。如果无法乘巴士从饭店到达S公园,则输出“N0”,否则输出你的程序所找到的最少换车次数,换车次数为0表示不需换车即可到达。样例 INPUT.TXT 3 7 6 7 4 7 3 6 2 1 3 5 OUTPUT.TXT 2 [分析]此题是Noi97第一试的第二题,看完题目的描述后我们很容易就想到“这道题目是不是跟图论有关?”,然后我们发现问题是求最少的换车次数,于是又可以想到“这是不是可以用最短路来解决?”如果可以,问题就成了如何构建最短路的图论模型。 (一)模型的构建方法 首先我们来分析样例所表示的图: 考察4 ——> 7 ——> 3 ——> 6这条线路。由于巴士在同一线路上行走不需换车,我们可设4 ——> 7,4 ——> 3,4 ——> 6,7 ——> 3,7 ——> 6,3 ——> 6这些边的权值都为1。对每条线路我们都这样构图,然后问题就转化成求起点1到终点n的最短路。图2: (二)问题转化:假设最短路长为m 。由于坐车耗费在每条线路上的代价都是1,而不同线路间是通过同一站联系的,所以换线路并不耗时,因此m即表示从起点1到终点n所经过的最少线路数。而最少换车次数即等于经过的最少线路数减一。 问题C:求解《01串问题》(NOI99试题) 问题描述:给定7个整数N,A0,B0,L0,A1,B1,L1,要求设计一个01串S=s1s2…s i…s N,满足:(1)s i=0或s i=1,1<=i<=N; (2)对于S的任何连续的长度为L0的子串s j s j+1…s j+L0-1(1<=j<=N-L0+1),0的个数大于等于A0且小于等于B0; (3)对于S的任何连续的长度为L1的子串s j s j+1…s j+L1-1(1<=j<=N-L1+1),1的个数大于等于A1且小于等于B1; 例如,N=6,A0=1,B0=2,L0=3,A1=1,B1=1,L1=2,则存在一个满足上述所有条件的01串S=010101。