当前位置:文档之家› 数据结构-第七章图(关键路径和最短路径)

数据结构-第七章图(关键路径和最短路径)


时间分析: O( n 2 )
#include<iostream.h>
int search(char e);//查找顶点在顺序表中的下标
#define max 20
class Arcbox{ public: int tailvex,headvex; Arcbox *hlink,*tlink;}; class VexNode{ public: char data; Arcbox *firstin,*firstout;}; class OLgraph{ };
int count=0;
int i=search(e); Arcbox *p=xlist[i].firstout; while(p){ count++; p=p->tlink;} return count;
void main(void){ char ch; OLgraph G;
G.CreateDG();
13 8 g

30
32 7 17
7. Dijkstra 算法的C语言描述 由于C/C++的下标从0开始,所以算法中作相应的改动,用NUM代表 图的顶点数 #define NUM void shortpath_dij(g[][NUM],v0) //v0为源点,值为1到NUM { for(i=0;i<NUM;i++){ set[i]=0; dist[i]=g[v0-1][i];} set[v0-1]=1; for(i=1;i<NUM;i++) { min=MAXINT; for(w=0;w<NUM;w++) if(set[w]= =0 && dist[w]<min) { v=w; min=dist[w]; } set[v]=1; for(w=0;w<NUM;w++) if(set[w]= =0 && dist[v]+g[v][w]<dist[w]) dist[w]=dist[v]+g[v][w]; }//for i } //shortpath_dij
(2)从vl(n)=ve(n)开始向源点递推(汇点的最早开始时间与最迟时间是 一致的)
10
j1
20
vl(i ) Min {vl( j ) dut( i, j )}
j
i
7
9
j2
jm
18
i, j S ,1 i n 1
其中,S是所有以i顶点为尾的弧的集合
15
求关键路径例子 活动的最早开始时间: e(i)=ve(j)
j
ai dut<j,k>
k
ve(j)和vl(j)的求法: (1)从ve(1)=0开始向汇点递推 5 7 i1 i2 9 4 6 im 10 j
ve( j ) Max {ve(i) dut( i, j )}
i
i, j T ,2 j n
其中,T是所有以j顶点为头的弧的集合
D
F G
5
10 6
ω
α
3
4
6
1
12
H
9
4
J
9
I
K
7.6 最短路径
7.6.1 从某个源点到其余各顶点的最短路径(单源最短路径问题) 1.问题的提出 用带权的有向图表示一个交通运输网,图中: 顶点——表示城市 边——表示城市间的交通联系 权——表示此线路的长度或沿此线路运输所花的时间或费用等 问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中, 各边上权值之和最小的一条路径——最短路径 2. 迪杰斯特拉(Dijkstra)算法思想 按路径长度递增次序产生最短路径 3.所需的辅助数组dist dist[i](i=1,..n)存放当前从源点V0到顶点i的最短路径长度,其初态为 弧 <v0,i>上的权值,若该弧不存在,则为无穷大。
cin>>ch; cout<<G.indegree(ch)<<endl; cout<<G.outdegree(ch)<<endl; }
4.算法实现分析 设一个集合U,存放已产生的最短路径的顶点。初始,U只包 含源点v0 15 2 第一条路:1到2、3、 4 5 5,6之一。 7 1 9 取dist[i]最小,为3,3 5 13 加到U中 4 8 第二条路:1到2、5、8、 9 6之一。而且,3加到U 3 3
20
序号 1 2 3 4
xlist[i].firstout=p;}
int OLgraph::outdegree(char e){
xlist[i].firstout=NULL;}
for( k=0;k<arcnum;++k){ lab:cin>>v>>w; i=search(v); j=search(w); if(i==-1||j==-1){ cout<<"查无此点"; goto lab;} }
1
2 5 3 a6=2 4 活动 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 e 0 0 0 6 4 5 7 7 7 16 14 6 l

7 9 8
活动的最迟开始时间: l(i)=vl(k) - dut(<j , k >)
顶点 V1 V2 V3 V4 V5 V6 V7 V8 V9
int indegree(char e);//计算e的入度
int outdegree(char e);//计算e的出度
int OLgraph::search(char e){ for(int i=0;i<vexnum;i++) if(xlist[i].data==e) return i; return -1;} int OLgraph::indegree(char e){ int count=0; int i=search(e);

6
5 6 7
∞ ∞
7
13
中后,某些顶点的dist 值应调整。
8
如果下一条最短路径 到达顶点x,则从源点到 x的中间点必定都在U中
dist值
5 4
9 20
6. Dijkstra 算法描述
图用邻接矩阵表示,设置集合U与辅助数组 9 dist, 5 源点vo图的顶点数为n。 6 g[i,j]代表<i,j>上的权; <i,j>不存在,g[i,j]就为无穷大。 2 (1) dist[i]= g[v0,i] i=1,2,….,n (2) U=[v0]; (3) 下面步骤重复n-1次 a) 选择v使得满足 dist[v]=min{ dist[u]|uU} 1 2 3 4 5 6 7 b) v加到集合U中 U=U{v} dist 13 8 30 32 c) 修改不在集合U中顶点的dist值 1 2 3 4 5 6 7 dist[w]=min{dist[w],dist[v]+g[v,w]|wU} dist 13 8 13 30 32 1 32 1 2 3 4 5 6 7 8 13 2 dist 13 8 13 30 22 20 3 1 2 3 4 5 6 7 30 9 7 5 7 dist 13 8 13 19 22 20 4 1 2 3 4 5 6 7 6 17 6 2 1 2 3 4 5 6 7 dist 13 8 13 19 21 20 5 dist 13 8 13 19 21 20
p=new Arcbox; p->tailvex=i;p->headvex=j; p->hlink=xlist[j].firstin; p->tlink=xlist[i].firstout; xlist[j].firstin=p;
for( i=0;i<vexnum;i++){
cin>>xlist[i].data; xlist[i].firstin=NULL; }
Ve 0 6 4 5 7 7 16 14 18
Vl 0 6 6 8 7 10 16 14 18
0 2 3 6 6 8 7 7 10 16 14
l-e 0 2 3 0 2 3 0 0 3 0 0
作业:列出下面AOE-网的关键路径
A
1
6
6
2
C
8 11 4
8
E
10 3 21
B
7
3
事件的最早发生时间(ve(j)):从源点到j结点的最长的 路径。意味着事件最早能够发生的时间。 事件的最迟发生时间(vl(j)):不影响工程的如期完工 ,事件j必须发生的时间。 活动ai由弧<j,k>表示,持续时间记为 dut<j,k>,则有: 活动的最早开始时间:e(i)=ve(j) 活动的最迟开始时间:l(i)=vl(k) - dut(<j , k >) 活动余量:l(i)-e(i)的差 关键活动:活动余量为0的活动 关键路径:从源点到汇点的最长的一条路径,或者全部由关键 活动构成的路径。 如何求ve(j)和vl(j)?
第七章 图
1、图的定义和术语 2、图的存储结构 3、图的遍历 4、图的连通性问题 5、有向无环图及其应用 6、最短路径
7.5.2
关键路径
1.AOE网(Activity On Edge)——带权的有向无环图,其中顶 点表示事件,弧表示活动,权表示活动持续时间。在工程上 常用来表示工程进度计划。 2.术语 源点:表示整个工程的开始点(入度为0)。 汇点:表示整个工程的结束点(出度为0)。 活动(有向边):它的权值定义为活动进行所需要的时间。方 向表示事件的优先关系。
相关主题