最短路模型的构建与求解方法方案曹利国教案

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档