离散数学 最短路径问题
离散数学最短路径和关键路径

*
1
关键路径(续)
vi的缓冲时间TS(vi)=TL(vi)-TE(vi), i=1,2,,n vi在关键路径上TS(vi)=0
*
例2 求PERT图中各顶点的最早完成时间, 最晚完成
时间, 缓冲时间及关键路径.
解 最早完成时间
TE(v1)=0
TE(v2)=max{0+1}=1
TE(v3)=max{0+2,1+0}=2
设带权图G=<V,E,w>, 其中eE, w(e)0. 设V={v1,v2,,vn}, 求v1到其余各顶点的最短路径 p标号(永久性标号) : 第r步获得的v1到vi最短路径的 权 t标号(临时性标号) : 第r步获得的v1经过p标号顶点 到达vi的路径的最小权, 是v1到vi的最短路径的权的上 界 第r步通过集Pr={v | v在第r步已获得永久性标号} 第r步未通过集Tr=V-Pr
*
带权图G=<V,E,w>, 其中w:ER. eE, w(e)称作e的权. e=(vi,vj), 记w(e)=wij . 若vi,vj不 相邻, 记wij =. 设L是G中的一条路径, L的所有边的权之和称作L的 权, 记作w(L). u和v之间的最短路径: u和v之间权最小的通路.
标号法(, 1959)
*
标号法(续)
例1(续) 求v0到v5的最短路径 v0 v1 v2 v3 v4 v5 0 0 1 4 1 1/v0 3 8 6 2 3/v1 8 4 3 7 4/v2 10 4 7/v4 9 5 9/v3 w 0 1 3 7 4 9 =v0v1v2v4v3v5, w()=9
*
关键路径
vi的最早完成时间TE(vi): 从始点v1沿最长路径到vi
离散数学最短路径和关键路径

例1 L1=v0v1v3v5, w(L1)=10, L2=v0v1v4v5, w(L2)=12,
L3=v0v2v4v5, w(L3)=11.
3
标号法(E.W.Dijkstra, 1959)
设带权图G=<V,E,w>, 其中eE, w(e)0. 设V={v1,v2,,vn}, 求v1到其余各顶点的最短路径
的顶点, 称作终点. 通常边的权表示时间, 始点记作v1, 终点记作vn
7
关键路径
关键路径: PETR图中从始点到终点的最长路径 vi的最早完成时间TE(vi): 从始点v1沿最长路径到vi 所需的时间
TE(v1)=0
TE(vi)=max{TE(vj)+wji|vj -(vi)}, i=2,3,,n
vi的最晚完成时间TL(vi): 在保证终点vn的最早完成 时间不增加的条件下, 从始点v1最迟到达vi的时间
TL(vn)=TE(vn)
TL(vi)=min{TL(vj)-wij|vj +(vi)}, i=n-1,n-2,,1
8
关键路径(续)
vi的缓冲时间TS(vi)=TL(vi)-TE(vi), i=1,2,,n vi在关键路径上TS(vi)=0
离散数学最短路径和 关键路径
7.4 最短路径与关键路径
带权图 最短路径与Dijkstra标号法 PERT图与关键路径
2
最短路径
带权图G=<V,E,w>, 其中w:ER.
eE, w(e)称作e的权. e=(vi,vj), 记w(e)=wij . 若vi,vj不 相邻, 记wij =.
设L是G中的一条路径, L的所有边的权之和称作L的 权, 记作w(L). u和v之间的最短路径: u和v之间权最小的通路.
实验三最短路径的算法(离散数学实验报告)

实验三最短路径的算法(离散数学实验报告)实验3:最短路径算法⼀、实验⽬的通过本实验的学习,理解Floyd(弗洛伊得)最短路径算法的思想⼆、实验内容⽤C语⾔编程实现求赋权图中任意两点间最短路径的Floyd算法,并能对给定的两结点⾃动求出最短路径三、实验原理、⽅法和⼿段1、Floyd算法的原理定义:Dk[i,j] 表⽰赋权图中从结点vi出发仅通过v0,v1,┉,vk-1中的某些结点到达vj的最短路径的长度,若从vi到vj没有仅通过v0,v1,┉,vk-1 的路径,则D[i,j]=∝即D-1[i,j] 表⽰赋权图中从结点vi到vj的边的长度,若没有从结点vi到vj的边,则D[i,j]=∝D0[i,j] 表⽰赋权图中从结点vi到vj的”最短”路径的长度, 这条路上除了可能有v0外没有其它结点D1[i,j] 表⽰赋权图中从结点vi到vj的”最短”路径的长度, 这条路上除了可能有v0,v1外没有其它结点┉┉┉根据此定义,D k[i,j]=min{ D k-1[i,j] , D k-1[i,k-1]+D k-1[k-1,j] }定义:path[i,j]表⽰从结点vi到vj的“最短”路径上vi的后继结点四、实验要求要求输出每对结点之间的最短路径长度以及其最短路径五、实验步骤(⼀)算法描述Step 1 初始化有向图的成本邻矩阵D、路径矩阵path若从结点vi到vj有边,则D[i,j]= vi到vj的边的长度,path[i,j]= i;否则D[i,j]=∝,path[i,j]=-1Step 2 刷新D、path 对k=1,2,┉n 重复Step 3和Step 4Step 3 刷新⾏对i=1,2,┉n 重复Step 4Step 4 刷新Mij 对j=1,2,┉n若D k-1[i,k]+D k-1[k,j][结束循环][结束Step 3循环][结束Step 2循环]Step 5 退出(⼆)程序框图参考主程序框图其中,打印最短路径中间结点调⽤递归函数dist(),其框图如下,其中fist,end是当前有向边的起点和终点dist(int first, int end)七、测试⽤例:1、输⼊成本邻接矩阵:D :06380532290141003210∝∝∝∝V V V V V V V V (其中∝可⽤某个⾜够⼤的数据值代替,⽐如100)可得最短路径矩阵:P :131132122211111010103210--------V V V V V V V V以及各顶点之间的最短路径和最短路径长度:从V0到V1的最短路径长度为:1 ;最短路径为:V0→V1 从V0到V2的最短路径长度为:9 ;最短路径为:V0→V1→V3→V2 从V0到V3的最短路径长度为:3 ;最短路径为:V0→V1→V3 从V1到V0的最短路径长度为:11;最短路径为:V1→V3→V2→V0从V1到V2的最短路径长度为:8 ;最短路径为:V1→V3→V2 从V1到V3的最短路径长度为:2 ;最短路径为:V1→V3 从V2到V0的最短路径长度为:3 ;最短路径为:V2→V0 从V2到V1的最短路径长度为:4 ;最短路径为:V2→V0→V1 从V2到V3的最短路径长度为:6 ;最短路径为:V2→V0→V1→V3 从V3到V0的最短路径长度为:9 ;最短路径为:V3→V2→V0 从V3到V1的最短路径长度为:10;最短路径为:V3→V2→V0→V1 从V3到V2的最短路径长度为:6 ;最短路径为:V3→V2 参考程序: #include #define INFINITY 100 #define Max 10int a[Max][Max],P[Max][Max]; main() {void Print_Flod(int d);int i,j,k,D=4;printf("请输⼊成本邻接矩阵:\n");for(i=0;ifor(j=0;j{scanf("%d",&a[i][j]);}for(i=0;ifor(j=0;j{if(a[i][j]>0&& a[i][j]elseP[i][j]=-1;}for(k=0;kfor(i=0;ifor(j=0;jif (a[i][k]+a[k][j]{a[i][j]=a[i][k]+a[k][j];P[i][j]=k;}Print_Flod(D);}void Print_Flod(int d){void dist(int first,int end);int i,j;for(i=0;ifor(j=0;jif(i!=j){ printf("from V%d to V%d: ",i,j); dist(i,j);printf("V%d",j);printf(" (The length is: %d)\n",a[i][j]); }}void dist(int first,int end){ int x;x=P[first][end];if(x!=first){ dist(first,x); dist(x,end); }else printf("V%d->",x);}输出结果:。
离散数学--第7章-图论-4最短路问题

返回 结束
7.4.2 Floyd算法
19
定义7.4.1:已知矩阵A=(aij)m×l,B=(bjk)l×n,规定C=A*B =(cij)m×n,其中cij=min(ai1+b1j, ai2+b2j, …, ail+blj)
定义7.4.2已知矩阵A=(aij)m×n,B=(bij)m×n,规定D=A B =(dij)m×n,其中dij=min(aij,bij)
Dijkstra算法在物流配送中的应用
OSPF(open shortest path first, 开放最短路径优先)算法是 Dijkstra算法在网络路由中的一个具体实现。
返回 结束
7.4 .1 Dijkstra算法
17
Dijkstra算法要求图上的权是非负数,否则 结果不正确;
Dijkstra算法同样适用于无向图,此时一个 无向边次相当于两个有向边。
5次 u=e,S={a,c,b,d,e}
迭 代
L(e)+ω (e,z)=10+3=13<L(z)
L(b)=3,L(d)=10,L(e)=12,L(z)
L(z)=13
=∞
结 u=z,S={a,c,b,d,e,z}
3次 u=b,S={a,c,b}
束 从a到z的最短路的长度为13。
迭代 L(b)+ω (b,d)=3+5=8<L(d) L(b)+ω (b,e)=3+∞=∞
返回 结束
7.4 .1 Dijkstra算法
9
procedure Dijkstra(G:所有权都为正数的加权连通简单图)
{G带有顶点a=v0,v1,…,vn=z和权ω(vi,vj),若(vi,vj)不是G的边,则ω(vi,vj)= ∞}
for i:=1 to n
离散数学 迷宫最短路径

迷宫最短路径⒈问题描述从一个迷宫的入口到出口找出一条最短路经。
用一个二维数组MAZE(1:m,1:n)模拟迷宫,数组元素为0表示该位置可以通过,数组元素为1表示该位置不可以通行。
MAZE(1,1)和MAZE(m,n)分别为迷宫的入口和出口。
⒉基本要求(1)输入数据a.输入迷宫的大小m行和n列,两者为整数b.由随机数产生0或1,建立迷宫。
(2)输出数据首先输出模拟迷宫的二维数组,若存在最短路经,则由出口回朔到入口打印这一条路径,如下所示:(m,n),……, (I,j),……, (1,1)如无通道,则打印:THERE IS NO PATH.#include<time.h>#define OVERFLOW -2#define ERROR 0#define NULL 0#define true 1#define TRUE 1#define false 0#define FALSE 0#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#include <stdio.h>#include <stdlib.h>/*初始化迷宫,1表示通道,0表示墙*/typedef struct MStackElem{int x;int y;int val;}MStackElem;typedef struct {MStackElem * base;MStackElem * top;int stackSize;}MStack;void initStack(MStack *s) {s->base = (MStackElem *)malloc(STACK_INIT_SIZE * sizeof(MStackElem));if (!s->base) {printf("in initStack()...Failed to initalize the MStack ,no enough spac e! exit now. ");exit(OVERFLOW);}s->top = s->base;s->stackSize = STACK_INIT_SIZE;}void push(MStack *s,MStackElem e) {if (s->top - s->base >= s->stackSize) {s->base = (MStackElem *)realloc(s->base, (STACK_INIT_SIZE+STACKINCREMEN T) * sizeof(MStackElem));if (!s->base) {printf("in push()...Failed to realloc the MStack ,no enough space! exi t now. ");exit(OVERFLOW);}s->top = s->base + s->stackSize;s->stackSize += STACKINCREMENT;}*(s->top++) = e;}MStackElem getTop(MStack *s) {if (s->top == s->base) {printf("in getTop(),empty stack! exit now. ");exit(ERROR);}else {return *(s->top - 1);}}void pop(MStack *s) {if (s->top == s->base) {printf("in pop(),empty stack! exit now. ");exit(ERROR);}else {--(s->top);}}MStack realPath,path;int unPass(MStack path,MStackElem cur) {int flag = 1;while(path.top != path.base){MStackElem e = *(path.top - 1);if (e.x == cur.x&& e.y == cur.y)回复2楼2010-01-15 19:07举报 |吧友125.77.120.*{flag = 0;}(path.top)--;}return flag;}MStackElem getEast(MStackElem cur,int *maze,int n) { if(cur.y != 7) {cur.y += 1;cur.val = *(maze+cur.x*n+cur.y);}return cur;}MStackElem getSouth(MStackElem cur,int *maze,int n) { if(cur.x != 7) {cur.x += 1;cur.val = *(maze+cur.x*n+cur.y);}return cur;}MStackElem getWest(MStackElem cur,int *maze,int n) {if(cur.y != 0) {cur.y -= 1;cur.val = *(maze+cur.x*n+cur.y);}return cur;}MStackElem getNorth(MStackElem cur,int *maze,int n) {if(cur.x != 0) {cur.x -= 1;cur.val = *(maze+cur.x*n+cur.y);}return cur;}MStackElem getNext(MStackElem cur,int *maze,int n) {MStackElem next;next.x = next.y=next.val = -1;if(getEast(cur,*maze,n).val != 0 && unPass(path,getEast(cur,*maze,n))) {next = getEast(cur,*maze,n);}else if(getSouth(cur,*maze,n).val != 0 && unPass(path,getSouth(cur,*maze,n))) { next = getSouth(cur,*maze,n);}else if(getWest(cur,*maze,n).val != 0 && unPass(path,getWest(cur,*maze,n))) { next = getWest(cur,*maze,n);}else if(getNorth(cur,*maze,n).val != 0 && unPass(path,getNorth(cur,*maze,n))) { next = getNorth(cur,*maze,n);}return next;}int getMazePath(int *maze,int n){回复3楼2010-01-15 19:07举报 |吧友125.77.120.*MStackElem start,end,cur;start.x = 0;start.y = 0;start.val = *(maze+start.x*n+start.y);end.x = 7;end.y = 7;end.val = *(maze+end.x*n+end.y);cur = start;printf("%d",cur.x);printf("%d",cur.y);printf("%d",cur.val);do{if (unPass(path,cur)) {push(&realPath,cur);push(&path,cur);cur = getNext(cur,*maze,n);if (cur.x == end.x && cur.y == end.y) {push(&realPath,cur);push(&path,cur);return true;}else if(cur.val == -1) {pop(&realPath);cur = getTop(&realPath);}}else {cur = getNext(cur,*maze,n);if (cur.val == -1) {pop(&realPath);cur = getTop(&realPath);}}} while (cur.x != end.x || cur.y != end.y); }。
dijkstra最短路径算法步骤离散数学

dijkstra最短路径算法步骤离散数学Dijkstra最短路径算法是一种经典的图论算法,用于解决单源最短路径问题。
它由荷兰计算机科学家艾兹赫尔·迪科斯彻在1956年提出,被广泛应用于网络路由算法等领域。
Dijkstra算法的核心思想是通过不断更新节点之间的最短路径来找到从源节点到目标节点的最短路径。
在离散数学中,Dijkstra算法是一种十分重要的算法,在实际应用中也具有很高的效率和可靠性。
Dijkstra算法的步骤相对简单,但是需要一定的数学基础和思维逻辑。
首先,需要定义一个起始节点,将其到其他所有节点的距离初始化为无穷大,然后将其加入到一个集合中。
接着,选择集合中距离起始节点最近的节点作为当前节点,更新当前节点到其他节点的距离,如果通过当前节点到其他节点的距离比起始节点到其他节点的距离更短,则更新最短距离。
重复这个过程,直到所有节点都被遍历过一次,最终得到从起始节点到其他所有节点的最短路径。
在离散数学中,Dijkstra算法常常被用来解决网络连接、通信传输等问题。
例如,在计算机网络中,路由器通过Dijkstra算法计算最短路径,将数据包发送到目标地址,保证通信的快速和稳定。
又如在电力系统中,Dijkstra算法可以用来优化电网的输电路径,减少能量损耗,提高供电质量。
因此,学习和掌握Dijkstra算法对于离散数学的学习和实践具有重要意义。
除了Dijkstra算法,离散数学还包括许多其他重要的内容,如图论、集合论、逻辑推理等。
图论是离散数学的一个重要分支,研究图的性质和图之间的关系。
集合论是研究集合及其元素之间的关系和性质的数学分支,是数学中的基础理论之一。
逻辑推理是研究命题之间推理关系的数学分支,是数学和哲学的交叉领域。
这些内容共同构成了离散数学这门学科的基础,对于理解和应用数学知识具有重要意义。
总的来说,Dijkstra最短路径算法是离散数学中的一个重要内容,通过学习和掌握该算法,可以更好地理解和运用离散数学知识。
离散数学 实验报告 迷宫最短路径问题求解

离散数学迷宫问题问题描述:一只老鼠走进了一个迷宫,这个迷宫是由M行N列(如:10行8列)的方格构成的,相邻方格之间可能是相通的,也可能有墙相隔,各方格位置由其对应坐标确定,如图所示。
迷宫在(1,1)处有一个入口,在(M,N)处有一个出口,在入口和出口之间有通路相通。
问题是让你帮助老鼠找出从入口到出口的一条最短路径。
00001000110010100001000000001010101000000011101110001000基本要求:为老鼠找出一条从入口到出口的最短路径。
实现提示:1、迷宫用数组表示,1代表是墙走不通,0表示可以通行。
边界可以扩充为墙,即M×N 迷宫用(M+2)×(N+2)数组表示。
2、向4个方向前进时的位移量可以用以下数组表示,处理是方便。
int move[4][2]={ {0,1},{1,0},{0,-1},{-1,0} };3、采用图的广度优先搜索算法。
#include<stdio.h>#define m 7#define n 8void path(){int maze[m+2][n+2] ;int move[4][2]={ {0,-1},{-1,0},{0,1},{1,0} };int s[54][3];int top=0;int i,j,k,f=0;int g,h,p;for(i=0;i<m+2;++i)for(j=0;j<n+2;++j)scanf("%d",&maze[i][j]);maze[1][1]=2;s[top][0]=1;s[top][1]=1;s[top][2]=0;++top;while(top!=0&&f==0){--top;i=s[top][0];j=s[top][1];k=s[top][2];while(k<4){g=i+move[k][0];h=j+move[k][1];if(g==m&&h==n&&maze[g][h]==0) {for(p=0;p<top;++p)printf("%3d,%d\n",s[p][0],s[p][1]);printf("%3d,%d\n",i,j);printf("%3d,%d\n",m,n);f=1;}//ifif(maze[g][h]==0){maze[g][h]=2;s[top][0]=i;s[top][1]=j;s[top][2]=k;++top;i=g;j=h;k=0;}//ifk=k+1;}//while}//whileif(f==0)printf("no path\n"); }//pathvoid main(){path();}。
离散数学 最短路径dijkstra算法

离散数学是数学的一个分支,研究离散对象和不连续对象的数量关系及其结构的数学学科。
离散数学对于计算机科学和信息技术领域有着重要的应用,其中最短路径dijkstra算法是离散数学中的一个重要算法,它被广泛应用于计算机网络、交通规划、电路设计等领域,在实际应用中发挥着重要的作用。
一、最短路径dijkstra算法的基本原理最短路径dijkstra算法是由荷兰计算机科学家艾兹赫尔·达斯提出的,用于解决带权图中的单源最短路径问题。
该算法的基本原理是:从一个源点出发,按照权值递增的顺序依次求出到达其它各个顶点的最短路径。
具体来说,最短路径dijkstra算法的实现步骤如下:1. 初始化:将源点到图中各个顶点的最短路径估计值初始化为无穷大,将源点到自身的最短路径估计值初始化为0;2. 确定最短路径:从源点开始,选择一个离源点距离最近的未加入集合S中的顶点,并确定从源点到该顶点的最短路径;3. 更新距离:对于未加入集合S中的顶点,根据新加入集合S中的顶点对其进行松弛操作,更新源点到其它顶点的最短路径的估计值;4. 重复操作:重复步骤2和步骤3,直到集合S中包含了图中的所有顶点为止。
二、最短路径dijkstra算法的实现最短路径dijkstra算法的实现可以采用多种数据结构和算法,比较常见的包括邻接矩阵和邻接表两种表示方法。
在使用邻接矩阵表示图的情况下,最短路径dijkstra算法的时间复杂度为O(n^2),其中n表示图中顶点的个数;而在使用邻接表表示图的情况下,最短路径dijkstra 算法的时间复杂度为O(nlogn)。
三、最短路径dijkstra算法的应用最短路径dijkstra算法可以应用于计算机网络中路由选择的最短路径计算、交通规划中的最短路径选择、电路设计中的信号传输最短路径计算等领域。
在实际应用中,最短路径dijkstra算法通过寻找起始点到各个顶点的最短路径,为网络通信、交通规划、电路设计等问题提供有效的解决方案。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
权和为10 权和为 权和为9 权和为 权和为10 权和为 权和为15 权和为 e 权和为 权和为18 权和为13 权和为
8
由此可见: 关于 的指标D 关于T的指标 由此可见:e关于 的指标 T(e) = 9
对于目标集T={e,f,g,z},已用穷举法得到e关于 的指标 对于目标集 ,已用穷举法得到 关于T的指标 关于 DT(e) = 9 ,同样用穷举法可得 关于 的指标 T(f) = 6, 同样用穷举法可得f 关于T的指标 的指标D g关于 的指标 T(g) = 8,对于点 ,由于不存在 关于T的指标 关于 的指标D ,对于点z a到z但不通过 中其它点的通路,约定DT (z ) = ∞ 。 到 但不通过 中其它点的通路, 但不通过T中其它点的通路 比较T中四个点的指标可知: 的指标最小,因此可得: 比较 中四个点的指标可知:点f 的指标最小,因此可得: 中四个点的指标可知 a 到f 的最短通路权和为 T(f) = 6。 的最短通路权和为D 。
5
三、赋权图的最短通路
基本思想:先求出 到某一点的最短通路 到某一点的最短通路, 基本思想:先求出a到某一点的最短通路, 然后利用这个结果再去确定a到另一点的最短通路, 然后利用这个结果再去确定 到另一点的最短通路, 到另一点的最短通路 如此下去,直到找到 到 的最短通路为止 的最短通路为止。 如此下去,直到找到a到z的最短通路为止。
9
一般地, 中指标最小的点, 一般地,设T={t1, t2, …, tn},其中 1为T中指标最小的点, ,其中t 中指标最小的点 即 DT(t1) =min(DT(t1) , DT(t2),…DT(tn))
则a到t1的最短通路的权和就是 T(t1) 。 到 的最短通路的权和就是D 当得到目标集T中最小指标点 是目的地z,则问题得解。 当得到目标集 中最小指标点t1后,如果 t1是目的地 ,则问题得解。 中最小指标点 如果t 不是目的地z,则把t 中挖去, 如果 1不是目的地 ,则把 1从T中挖去,得到新的目标集 1, 中挖去 得到新的目标集T 即 T1=T-{t1}
DT1(e) = DT1(f) = DT1(g) = DT1(z)=∞ 比较以上各点的指标可知, 是最小指标点 是最小指标点。 比较以上各点的指标可知,b是最小指标点。但b不是目标 不是目标 于是可得: 点,所以挖去b,于是可得: 所以挖去 于是可得
14
(2)令T2=T1-{b}={c,d,e,f,g,z},T2中各点的指标为: ) , 中各点的指标为: DT2(c)=min(DT1(c), DT1(b)+W(b,c))=min(4,2+3)=4 (a DT2(d)= min(DT1(d), DT1(b)+W(b,d))=min(3,∞)=3 (a DT2(e)= min(DT1(e), DT1(b)+W(b,e))=min(∞,2+6)=8(a DT2(f)= min(DT1(f), DT1(b)+W(b,f))=min(∞, ∞)=∞ DT2(g)= min(DT1(g), DT1(b)+W(b,g))=min(∞, ∞)=∞ DT2(z)= min(DT1(z), DT1(b)+W(b,z))=min(∞, ∞)=∞ 比较以上各点的指标可知, 是最小指标点。 不是目标点, 比较以上各点的指标可知,d 是最小指标点。但 d 不是目标点,
2
一、问题的提法及应用背景
(1)问题的提法 问题的提法——寻求网络中两点间的最 寻求网络中两点间的最 短路就是寻求连接这两个点的边的总权数为 短路就是寻求连接这两个点的边的总权数为 最小的通路。 最小的通路。 (2)应用背景 应用背景——管道铺设、交通网络、线 管道铺设、 管道铺设 交通网络、 路安排、厂区布局、设备更新等。 路安排、厂区布局、设备更新等。
若取T={e,f,g,z},点e关于 的指标 T(e)就是由 到e 但不通过 中其 , 关于T的指标 就是由a到 但不通过T中其 若取 关于 的指标D 就是由 他点( 他点(即f,g,z)的所有通路中权和最小者。 )的所有通路中权和最小者。
7
如图
用穷举法可得: 到 但不通过T中其他点 中其他点( 用穷举法可得:a到e 但不通过 中其他点(即f,g,z) ) 的通路有: 的通路有: a b a a a a a b c c d d e c e b c c e b e e
10
以上用穷举法求目标集中各点的指标,思路简单, 以上用穷举法求目标集中各点的指标,思路简单, 但方法不可取,特别是图中的点较多时。 但方法不可取 特别是图中的点较多时。 特别是图中的点较多时
下面介绍用递推的方法来求目标集中各点的指标。 下面介绍用递推的方法来求目标集中各点的指标。
11
如果已经求得目标集T={t1, t2, …, tn}中各点的指标 设t1为T中指标最 中各点的指标,设 如果已经求得目标集 中各点的指标 中指标最 小的点,那么能推出 中各点的指标. 中各点的指标 小的点,那么能推出T1=T-{t1}中各点的指标 已不属于目标集T 对于 中与t 对于T 只须注意到 t1已不属于目标集 1,对于 1中与 1邻接的点 t ,当寻求这点 t 当寻求这点 的指标时, 所组成的通路,也是一条由 的指标时 将a到t1的最短通路再加上边 1t所组成的通路 也是一条由 到t 到 的最短通路再加上边t 所组成的通路 也是一条由a到 但不通过T 中其他点的所有通路.所以 关于T 所以t关于 但不通过 1中其他点的所有通路 所以 关于 1的指标 DT1(t) =min(DT(t), DT(t1)+W(t1,t)) 其中W(t1,t)是边 1,t上的权 是边t 上的权. 其中 是边 上的权 对于T 中与t 那么它的指标没有发生变化, 对于 1中与 1不邻接的点 t2 , 那么它的指标没有发生变化 即 DT1(t2) = DT (t2)
6
目标集——设V是图的点集,T是V的子集,且T 含有目标 z 但不含有 , 设 是图的点集 是图的点集, 是 的子集 的子集, 但不含有a, 目标集 则称T为目标集。 则称 为目标集。 为目标集 指标——在目标集 中任取一点 t ,由 a 到 t 但不通过目标集 中 在目标集T中任取一点 但不通过目标集T中 指标 在目标集 其他点的所有通路中各边权之和(简称为通路权和) 其他点的所有通路中各边权之和(简称为通路权和)的 关于T 的指标, 最小者称为点 t 关于 的指标,记为 DT(t)。 。
比较以上各点的指标可知, 是最小指标点 是最小指标点。 不是目标点, 比较以上各点的指标可知,c是最小指标点。但c 不是目标点,
16
所以挖去c 于是可得 于是可得: 所以挖去 ,于是可得:
(4)令T4=T3-{c}={e,f,g,z},T4中各点的指标为: ) , 中各点的指标为: DT4(e)=min(DT3(e), DT3(c)+W(c,e))=min(8,4+2)=6 (a ) DT4(f)=min(DT3(f), DT3(c)+W(c,f))=min(5,4+6)=5 (a ) DT4(g)=min(DT3(g), DT3(c)+W(c,g))=min(10,4+7)=10(a ) g) DT4(z)=min(DT3(z), DT3(c)+W(c,z))=min(∞,∞)=∞ ) 比较以上各点的指标可知, 是最小指标点 是最小指标点。 不是目标点 不是目标点, 比较以上各点的指标可知,f是最小指标点。但f不是目标点,
最短路径问题
如下图所示的单行线交通网, 例:如下图所示的单行线交通网,每个弧旁边的 数字表示这条单行线的长度。现在有一个人要从v 数字表示这条单行线的长度。现在有一个人要从 1出 发,经过这个交
v2
通网到达v 通网到达 6,
3
6 4 1
v4 3
要寻求总路 程最短的线 路。
v3 v1 5 v5 1 2
对于T 又求出其各点的指标,并确定最小指标点, 对于 1,又求出其各点的指标,并确定最小指标点,如果这个最小 指标点就是目的地z,则问题得解。如果不是目的地 ,则把在T 指标点就是目的地 ,则问题得解。如果不是目的地z,则把在 1中 又挖去这个最小指标点,得到新的目标集 不断重复上述过程, 又挖去这个最小指标点,得到新的目标集T2,不断重复上述过程, 直到目的地z为某个目标集的最小指标点为止。 直到目的地 为某个目标集的最小指标点为止。 为某个目标集的最小指标点为止 由此可见,求最短通路问题的关键是:如何求目标集中各点的指标。 由此可见,求最短通路问题的关键是:如何求目标集中各点的指标。
v6 6
1
的路线是很多的。比如从v 出发, 从v1到v6的路线是很多的。比如从v1出发, 经过v 到达v 或者从v 出发,经过v 经过v2 ,v4到达v6或者从v1出发,经过v2,v3, 到达v 等等。但不同的路线, v5到达v6等等。但不同的路线, 经过的总长 度是不同的。例如,按照第一个线路, 度是不同的。例如,按照第一个线路,总长 度是3 单位, 度是3+6+3=12单位,按照第二个路线,总长 12单位 按照第二个路线, 度是3 度是3+1+1+6=11单位。 11单位。 单位
DT3(f)=min(DT2(f), DT2(d)+W(d,f))=min(∞,3+2)=5 (a ) DT3(g)=min(DT2(g), DT2(d)+W(d,g))=min(∞,3+7)=10(a ) g) DT3(z)=min(DT2(z), DT2(d)+W(d,z))=min(∞,∞)=∞ )
13
用狄克斯特洛算法求下列图中a 的最短通路。 例1 用狄克斯特洛算法求下列图中 到z的最短通路。 的最短通路
解 (1)首先取目标集 1={b,c,d,e,f,g,z}, T1中各点的指标为: )首先取目标集T , 中各点的指标为: DT1(b) =2, DT1(c) =4, DT1(d) =3, (a (a (a b) c) d)ຫໍສະໝຸດ 3二、赋权图的定义