《数据结构与算法设计》d_第1页
《数据结构与算法设计》d_第2页
《数据结构与算法设计》d_第3页
《数据结构与算法设计》d_第4页
《数据结构与算法设计》d_第5页
已阅读5页,还剩152页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章图编辑ppt第2

页7.1图的术语与定义图的定义图(Graph)——图G是由两个集合V(G)和E(G)组成的,记为G=(V,E)其中:V(G)是顶点的非空有限集

E(G)是边的有限集合,边是顶点的无序对或有序对。图的分类有向图无向图编辑ppt第3

页7.1图的术语与定义图的定义有向图——有向图G是由两个集合V(G)和E(G)组成的。

其中:

V(G)是顶点的非空有限集。

E(G)是有向边(也称弧)的有限集合,弧是顶点的有序对,记为

<v,w>,v、w是顶点,v为弧尾,w为弧头。编辑ppt第4

页7.1图的术语与定义例如:G1=<V1,E1>V1={A,B,C,D,E}E1={<A,B>,<A,E>,<B,C>,<C,D>,<D,B>,

<D,A>,<E,C>}EACBD编辑ppt第5

页7.1图的术语与定义图的定义无向图——无向图G是由两个集合V(G)和E(G)组成的。 其中: V(G)是顶点的非空有限集。

E(G)是边的有限集合,边是顶点的无序对,记为

(v,w)或

(w,v),并且

(v,w)=(w,v)。编辑ppt第6

页7.1图的术语与定义例如:G2=<V2,E2>

V2={v0,v1,v2,v3,v4}

E2={(v0,v1),(v0,v3),(v1,v2),(v1,v4),

(v2,v3),(v2,v4)}V0V4V3V1V2编辑ppt网(Network)弧或边带权(Weight)的图分别称有向网和无向网ABCDE1341423906617.1图的术语与定义编辑ppt第8

页7.1图的术语与定义图的应用举例 例1.交通图(公路、铁路)

顶点:地点 边:连接地点的路 例2.电路图

顶点:元件 边:连接元件之间的线路 例3.通讯线路图

顶点:通讯站点

边:站点间的连线 例4.各种流程图 如产品的生产流程图。

顶点:工序 边:各道工序之间的顺序关系编辑ppt第9

页7.1图的术语与定义图的基本术语邻接点及关联边 邻接点:边的两个顶点互为邻接点 关联边:若边e=(v,u),则称顶点v、u关连边e。顶点V的度

=与V相关联的边的数目eV0V4V3V1V2编辑ppt第10

页7.1图的术语与定义顶点的度、入度、出度

在有向图中:

顶点V的出度

=以V为起点的有向边数

顶点V的入度

=以V为终点的有向边数

顶点V的度

=V的出度+V的入度

ABCDE设图G的顶点数为n,边数为e

图的所有顶点的度数和=2*e编辑ppt假设图中有n个顶点,e条边,则

含有e=n(n-1)/2条边的无向图称作完全图(Completedgraph)

含有e=n(n-1)

条弧的有向图称作有向完全图

若边或弧的个数e<nlogn,则称作稀疏图(Sparsegraph),否则称作稠密图(Densegraph).BADEC7.1图的术语与定义编辑ppt第12

页7.1图的术语与定义路径、回路

假设v1,v2,…,vk为图G=(V,E)的顶点序列,若G为无向图,则有(vi,vi+1)E;或者G为有向图,则有<vi,vi+1>E;其中(1≤i=1<k),v=v1,u=vk,则称该序列是从顶点v到顶点u的路径;路径上边的数目称作路径长度。

若第一个顶点和最后一个顶点相同,则称该序列为回路。

序列中顶点不重复出现的路径定义为简单路径

构成回路的简单路径称其为简单回路编辑ppt第13

页7.1图的术语与定义例如 在图G1中,V0,V1,V2,V3是V0到V3的路径,而且是简单路径;V0,V1,V2,V3,V0是简单回路。无向图G1有向图G2V0V4V3V1V2V0V1V2V3 在图G2中,V0,V2,V3是V0到V3的简单路径;V0,V2,V3,V0是简单回路。编辑ppt第14

页7.1图的术语与定义连通图 在无向图G=<V,E>中,若对任何两个顶点v、u都存在从v到u的路径,则称G是连通图。

G2:非连通图G1:连通图V0V2V3V1V5V4V0V4V3V1V2编辑ppt第15

页7.1图的术语与定义子图 设有两个图G=(V,E),G1=(V1,E1),若V1

V且E1

E,则称G1是G的子图。例(a)(b)(c)V0V4V3V1V2V0V4V3V1V2V0V4V3V1V2

(b)、(c)

是(a)

的子图编辑ppt第16

页7.1图的术语与定义若无向图为非连通图,则各个极大连通子图称作此图的连通分量。

极大连通子图含义:该子图是G的连通子图,将G的任何不在该子图中的顶点加入,子图不再连通。连通分量非连通图V0V2V3V1V5V4编辑ppt第17

页7.1图的术语与定义强连通图

在有向图G=<V,E>中,若对任何两个顶点v、u都存在从v到u的路径,则称G是强连通图。强连通图非强连通图V0V1V2V3V0V1V2V3编辑ppt第18

页7.1图的术语与定义若有向图为非强连通图,它的各个极大强连通子图称为它的强连通分量。

极大强连通子图含义:该子图是D的强连通子图,将D的任何不在该子图中的顶点加入,子图不再是强连通的。强连通分量

V0

V2

V3

V1V0V1V2V3编辑ppt第19

页7.1图的术语与定义生成树

连通图G中,包含所有顶点的极小连通子图称为G的生成树。

极小连通子图含义:该子图是G的连通子图,在该子图中删除任何一条边,子图不再连通。

若T是G的生成树当且仅当T满足如下条件: T包含G的所有顶点 T是G的连通子图

T中无回路连通图G1G1的生成树V0V4V3V1V2V0V4V3V1V2编辑ppt207.1图的基本操作1、结构的建立和销毁2、对顶点的访问操作3、对邻接点的操作4、插入或删除顶点5、插入和删除弧6、遍历编辑ppt217.1图的基本操作结构的建立和销毁CreatGraph(&G,V,VR):按定义(V,VR)构造图DestroyGraph(&G):销毁图对顶点的访问操作LocateVex(G,u);若G中存在顶点u,则返回该顶点在图中“位置”;否则返回其它信息GetVex(G,v);返回v的值PutVex(&G,v,value);对v赋值value

编辑ppt227.1图的基本操作对邻接点的操作FirstAdjVex(G,v);返回v的“第一个邻接点”。若该顶点在G中没有邻接点,则返回“空”NextAdjVex(G,v,w);返回v的(相对于w的)“下一个邻接点”。若w是v的最后一个邻接点,则返回“空”。插入或删除顶点InsertVex(&G,v);在图G中增添新顶点vDeleteVex(&G,v);删除G中顶点v及其相关的弧

编辑ppt237.1图的基本操作插入和删除弧DeleteVex(&G,v);删除G中顶点v及其相关的弧DeleteArc(&G,v,w);在G中删除弧<v,w>若G是无向的,则还删除对称弧<w,v>遍历DFSTraverse(G,v,Visit());从顶点v起深度优先遍历图G并对每个顶点调用函数Visit一次且仅一次BFSTraverse(G,v,Visit());从顶点v起广度优先遍历图G,并对每个顶点调用函数Visit一次且仅一次编辑ppt247.2图的存储表示

1、图的数组(邻接矩阵)存储表示2、图的邻接表存储表示3、有向图的十字链表存储表示4、无向图的邻接多重表存储表示编辑ppt第25

页7.2图的存储结构一、数组表示法(邻接矩阵表示)

邻接矩阵:G的邻接矩阵是满足如下条件的n阶矩阵:A[i][j]=1若(vi,vj)E或<vi,vj>E0否则01010010101011010001100在数组表示法中,用邻接矩阵表示顶点间的关系011000000001000V1V2V3V4V1V5V4V2V3vi的度?第i

行(列)1的个数。vi的出度?第i

行1的个数第i列1的个数。vi

的入度?编辑ppt第26

页7.2图的存储结构二、邻接表

邻接表是图的链式存储结构 1、无向图的邻接表

顶点:通常按编号顺序将顶点数据存储在一维数组中;

边节点:对于每个顶点,用线性边节点链表存储关联邻接点编号。

01234m-1V1V2V3V4V513V1V5V4V2V30241340212邻接点的位置共有多少边节点?2*e编辑ppt第27

页7.2图的存储结构typedefstructArcNode//边结点定义 {intadjvex;//邻接点域,//存放与Vi邻接的点在表头数组中的位置

structArcNode*next;//链域,下一条边或弧

}

ArcNode;adjvexnextvexdatafirstarctypedefstructtnode//顶点结点定义 {intvexdata;//存放顶点信息

ArcNode*firstarc;//指向第一个边或弧

}

VNode,AdjList[MAX_VERTEX_NUM];typedefstruct//图的定义 { AdjListvertices; int vexnum,arcnum;//顶点数和弧数 int kind;//图的种类 }编辑ppt第28

页7.2图的存储结构无向图的邻接表的特点

1)顶点v的度:等于v对应线性链表的长度;

2)判定两顶点v,u是否邻接:要看v对应线性链表中是否存在u。

3)在G中增减边:要在两个单链表插入、删除结点;

4)设存储顶点的一维数组大小为m(m图的顶点数n),图的边数为

e,G占用存储空间为:m个点+2*e个表节点。G占用存储空间与G的顶点数、边数均有关;适用于边稀疏的图。编辑ppt第29

页7.2图的存储结构二、邻接表 2、有向图的邻接表 顶点:用一维数组存储(按编号顺序) 以同一顶点为起点的弧:用线性出边节点链表存储弧头位置1234v1v3v4v2vexdatafirstarc

3

2

4

1^^^^adjvexnextV1V2V3V4弧头的位置顶点i

的出度?顶点i的出边表长度共有多少边节点?e出边表编辑ppt第30

页7.2图的存储结构二、邻接表 3、有向图的逆邻接表 顶点:用一维数组存储(按编号顺序) 以同一顶点为终点的弧:用记录弧尾位置的线性入边节点链表存储。1234v1v3v4v2vexdatafirstarc

4

1

1

3^^^^V1V2V3V4弧尾的位置顶点i

的入度?顶点i的入边表长度共有多少边节点?e入边表编辑ppt第31

页7.2图的存储结构三、有向图的十字链表表示法弧结点:typedefstructArcBox{inttailvex,headvex;//弧尾、弧头在表头数组中位置

structarcnode*hlink;//指向弧头相同的下一条弧

structarcnode*tlink;//指向弧尾相同的下一条弧}ArcBox;tailvexheadvexhlinktlink顶点结点:typedefstructVexNode{VertexTypedata;//存与顶点有关信息

ArcBox*firstin;//指向以该顶点为弧头的第1个弧结点

ArcBox*firstout;//指向以该顶点为弧尾的第1个弧结点}VexNode;VexNodeOLGraph[M];datafirstinfirstout编辑ppt第32

页7.2图的存储结构三、有向图的十字链表表示法例bdacabcd123413123431434241^^^^^^^^相同弧尾相同弧头编辑ppt第33

页7.2图的存储结构四、无向图的邻接多重表表示法顶点结点:typedefstructVexBox{VertexTypedata;//存与顶点有关的信息

EBox*firstedge;//指向第一条依附于该顶点的边}

VexBox;VexBoxAMLGraph[M];datafirstedge边结点:typedefstructnode{VisitIfmark;//标志域,记录是否已经搜索过

intivex,jvex;//该边依附的两个顶点在表头数组中位置

structEBox*ilink,*jlink;//分别指向依附于ivex和jvex的下一条边}

EBox;markivexilinkjvexjlink编辑ppt第34

页7.2图的存储结构四、无向图的邻接多重表表示法例aecbd1234acdb5e

12

14

34

3235

52^^^^^编辑ppt第35

页7.3图的遍历图的遍历

访遍图中所有的顶点,并且使图中的每个顶点仅被访问一次。遍历实质

遍历所有连通分量,

对于连通子图:根据邻接关系遍历所有顶点。

设置数组visited[0,…n]区分未访问的子图信息搜索路径深度优先遍历(DFS)广度优先遍历(BFS)编辑ppt第36

页7.3图的遍历图的深度遍历(DFS)

深度优先遍历连通图的过程类似于树的先根遍历,从图中某个顶点V出发,访问此顶点,然后依次从V的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V有路径相通的顶点都被访问到Vw1SG1SG2w2w3w2…V编辑ppt第37

页7.3图的遍历图的深度遍历(DFS)例:achdekfachdkfeachkfed访问次序bg编辑ppt第38

页7.3图的遍历图的深度遍历(DFS)例:bgabchdekfachdkfeachkfedbg访问次序bg编辑ppt第39

页7.3图的遍历图的深度遍历(DFS)V1V2V4V5V3V7V6V8例1深度遍历1:V1V2V4V8V5V6V3V7由于没有规定访问邻接点的顺序,所以深度优先序列不惟一。深度遍历2:V1V3V7V8V6V5V2V4编辑ppt第40

页7.3图的遍历图的深度遍历(DFS)——算法7.4和7.5开始标志数组初始化V=0V访问过?DFS(g,v)V=V+1V<VexNum结束NYYNDFS开始访问V,置标志求V邻接点有邻接点w求下一邻接点W访问过结束NYNYDFS(G,w)编辑ppt第41

页7.3图的遍历图的深度遍历(DFS)——递归算法voidDFSTrav(GraphG,Void(*Visit)(VertexTypee)){

for(v=0;v<G.vexnum;++v)visited[v]=FALSE;for(v=0;v<G.vexnum;++v)if(!visited[v])DFS(G,v,Visit);}//DFSTrav访问标志数组:intvisited[]

全局变量,初始时所有分量全为FALSE编辑ppt第42

页7.3图的遍历图的深度遍历(DFS)——递归算法voidDFS(GraphG,intv,void(*Visit)(VertexTypee)){

/*从v出发(v是顶点位置),深度优先遍历v所在的连通分量*/visited[v]=TRUE;

Visit(v);//先根遍历for(w=FirstAdjVex(G,v);w;w=NextAdjVex(G,v,w))if(!visited[w])DFS(G,w,Visit(w));}//DFS编辑ppt第43

页7.3图的遍历图的深度遍历(DFS)——递归算法V1V2V4V5V3V7V6V8例深度遍历:V112341342vexdatafirstarc

2

7

8

3^^^adjvexnext55

6

4

1^

5

1

2

8

2^678678

7

3

6

3

5

4^^^V3V7V6V2V5V8V4编辑ppt第44

页7.3图的遍历图的深度遍历(DFS)——递归算法V1V2V4V5V3V7V6V8例12341342vexdatafirstarc

2

7

8

3^^^adjvexnext55

6^

4

8

2^678678

7^^^深度遍历:V1V3V7V6V2V4V8V5编辑ppt第45

页7.3图的遍历深度优先遍历的时间复杂度 DFS对每一条边处理一次(无向图的每条边从两个方向处理),每个顶点访问一次。邻接表表示总代价为:O(点数n+边数e)邻接矩阵表示查询单个顶点的所有邻接点信息,需要O(n)的时间,所以总代价为O(n2)。编辑ppt第46

页7.3图的遍历图的广度遍历(BFS) 从图中某顶点v出发: 1)访问顶点v; 2)访问v所有未被访问的邻接点w1,w2,…wk; 3)依次从这些邻接点出发,访问其所有未被访问的邻接点。依此类推,直至图中所有和V0有路径相通的顶点都被访问到。编辑ppt第47

页7.3图的遍历图的广度遍历(BFS)例:abchdekfgacdefhkachkfed访问次序编辑ppt第48

页7.3图的遍历图的广度遍历(BFS)——递归算法开始标志数组初始化V=0V访问过BFSV=V+1V<Vexnum结束NYYN编辑ppt第49

页7.3图的遍历图的广度遍历(BFS)——递归算法voidBFSTraverse(GraphG,void(*Visit)(VertexType)){//本算法对图G进行广度优先遍历

for(v=0;v<G.vexnum;++v)visited[v]=FALSE;//访问标志数组初始化

for(v=0;v<G.vexnum;++v)if(!visited[v])BFS(G,v,Visit);}//BFSTraverse编辑ppt第50

页7.3图的遍历图的广度遍历(BFS)——算法7.6开始访问V0,置标志求V邻接点ww存在吗V下一邻接点ww访问过结束NYNYBFS初始化队列V0入队队列空吗队头V出队访问w,置标志w入队NY编辑ppt第51

页7.3图的遍历voidBFS(GraphG,intv,void(*Visit)(VertexTypee)){//从第v个顶点出发

InitQueue(Q);//建立辅助空队列Q

Visit(v);visited[v]=TRUE;

//访问u,访问标志数组EnQueue(Q,v);//v入队

while(!QueueEmpty(Q)){DeQueue(Q,u);//队头元素出队,并赋值给ufor(w=FirstAdjVex(G,u);w;w=NextAdjVex(G,u,w))if(!visited[w]){Visit(w);visited[w]=TRUE;

//访问uEnQueue(Q,w);}}//while}//BFS编辑ppt第52

页7.3图的遍历图的广度遍历(BFS)例1423512341342vexdatafirstarc

5

5

4

3^^^adjvexnext55

1^

5

1

1

4

3^

2

20123451fr遍历序列:10123454fr遍历序列:1401234543fr遍历序列:143编辑ppt第53

页7.3图的遍历图的广度遍历(BFS)例14235012345432fr遍历序列:1432012345

32fr遍历序列:1432012345

325fr遍历序列:1432512341342vexdatafirstarc

5

5

4

3^^^adjvexnext55

1^

5

1

1

4

3^

2

2编辑ppt第54

页7.3图的遍历图的广度遍历(BFS)/p>

25fr遍历序列/p>

5fr遍历序列/p>

fr遍历序列:1432512341342vexdatafirstarc

5

5

4

3^^^adjvexnext55

1^

5

1

1

4

3^

2

2编辑ppt第55

页7.3图的遍历遍历的应用 求两个顶点之间的最短路径长度

广度优先搜索访问顶点的次序是按“路径长度”渐增的次序。求路径长度最短的路径可以基于广度优先搜索遍历进行。abchdekfg编辑ppt第56

页7.4图的最小生成树生成树

包含无向图G所有顶点的极小连通子图称为G生成树,它只有n-1条边,可以构成一棵树。

极小连通子图含义:该子图是G的连通子图,在该子图中删除任何一条边,子图不再连通。

生成树T的特点:

T是G的连通子图

T包含G的所有顶点 T中有n-1条边T中无回路

连通图G1G1的生成树V0V4V3V1V2V0V4V3V1V2编辑ppt第57

页7.4图的最小生成树问题提出

假设要在n个城市之间建立通讯联络网,则连通n个城市只需要修建n-1条线路,如何在最节省经费的前提下建立这个通讯网?问题分析和数学建模:

顶点——表示城市

权——城市间建立通信线路所需花费代价

希望找到一棵生成树,它的每条边上的权值之和(即建立该通信网所需花费的总代价)最小——最小代价生成树MST(MinimumcostSpanningTree)

编辑ppt7.4图的最小生成树最小生成树(Leastweightedspanningtree):权(之和)最小的生成树。V3V1V4V6V5V23652165546V3V1V4V6V5V22415V3V1V4V6V5V2编辑ppt第59

页7.4图的最小生成树最小生成树的MST性质 若U集是V的一个非空子集,若在所有联接U和V-U的边中,(u,v)权值最小,其中uU,vV-U;则:必有一棵最小生成树包含(u,v)。典型算法普里姆(Prim)算法将顶点归并,与边数无关,适于稠密网。克鲁斯卡尔(Kruskal)算法将边归并,适于求稀疏网的最小生成树。编辑ppt60基本思想:从初始点u0开始将u0作为当前的最小生成树:T向T中增加一个节点:从与T的节点相连的所有边中(不包含两个顶点都在T内的边),找到最短的边,将该边及相应节点加入T中直到所有的节点都加入T中为止7.4图的最小生成树编辑ppt第61

页7.4图的最小生成树普里姆算法(Prim)

设G=(V,GE)为一个具有n个顶点的连通网络,T=(U,TE)为生成树。

(1)初始时,U={u0},TE=;

(2)在所有uU且vV-U的边(u,v)中选择一条权值最小的边,不妨设为(u,v);

(3)(u,v)加入TE,同时将v加入U;

(4)重复(2)(3),直到U=V为止;编辑ppt第62

页7.4图的最小生成树普鲁姆算法(Prim)——教材P175V3V1V4V6V5V23652165546V3V1V4V6V5V212V3V1V4V6V5V214V3V1V4V6V5V2142V3V1V4V6V5V21452V3V1V4V6V5V21453U={V1}U={V1,V3}U={V1,V3,V6}U={V1,V3,V6,V4}U={V1,V3,V6,V4,V2}U={V1,V3,V6,V4,V2,V5}编辑ppt第63

页7.4图的最小生成树辅助数组closedge[]对不在生成树中的每个顶点,记录其和生成树顶点相关联且代价最小的边:struct{VertexTypeAdjvex;//相关顶点VRTypelowcost;//最小边的权值}closedge[MAX_VERTEX_NUM];

closedge.Adjvex[v]:

顶点v到子集U中权最小边(v,u)相关联的顶点u

closedge.lowcost[v]:

顶点v到子集U权最小边

(v,u)的权值(距离)编辑ppt第64

页7.4图的最小生成树

V1V1V1

V10

6

1

5

maxmax

0(V1)

1(V2)

2(V3)3(V4)4(V5)5(V6)

closedge.Adjvexclosedge.Lowcost

3652165546V6V5V4V3V2V1

V1V3V1

V1V3V3

0

5

0

5

64

0(V1)

1(V2)

2(V3)3(V4)4(V5)5(V6)

closedge.Adjvexclosedge.Lowcost3652165546V6V5V4V3V2V1编辑ppt第65

页7.4图的最小生成树

V3V1V1V3V30

5

0

564

0(V1)

1(V2)

2(V3)3(V4)4(V5)

5(V6)

closedge.Adjvexclosedge.Lowcost

0(V1)

1(V2)

2(V3)3(V4)4(V5)

5(V6)

V3V1V6V3V30

5

0

260closedge.Adjvexclosedge.Lowcost

3652165546V6V5V4V3V26V5V4V3V2V1编辑ppt第66

页7.4图的最小生成树

V3V1

V6V3V30

5

00

6

0

0(V1)

1(V2)

2(V3)

3(V4)4(V5)

5(V6)

closedge.Adjvexclosedge.Lowcost3652165546V6V5V4V3V2V1

V3

V1

V6

V3V30

5

0

0

6

0

0(V1)

1(V2)

2(V3)

3(V4)4(V5)

5(V6)closedge.Adjvexclosedge.Lowcost3652165546V6V5V4V3V2V1编辑ppt第67

页7.4图的最小生成树

V3V1V6

V3

V30000

3

0

0(V1)1(V2)2(V3)3(V4)

4(V5)

5(V6)

closedge.Adjvexclosedge.Lowcost3652165546V6V5V4V3V26V5V4V3V2V1

V3

V1

V6

V3V30

5

0

0

6

0

0(V1)

1(V2)

2(V3)

3(V4)4(V5)

5(V6)closedge.Adjvexclosedge.Lowcost编辑ppt第68

页7.4图的最小生成树

V3V1V6V3V3000000

0(V1)1(V2)2(V3)3(V4)4(V5)5(V6)closedge.Adjvexclosedge.Lowcost3652165546V6V5V4V3V26V5V4V3V2V1编辑ppt第69

页7.4图的最小生成树voidMiniSpanTree_P(MGraphG,VertexTypeu){//用普里姆算法从顶点u出发构造网G的最小生成树

k=LocateVex(G,u);for(j=0;j<G.vexnum;++j)//辅助数组初始化

if(j!=k)closedge[j]={u,G.arcs[k][j]};closedge[k].Lowcost=0;//初始,U={u}for(i=1;i<G.vexnum;++i){}继续向生成树上添加顶点;编辑ppt第70

页7.4图的最小生成树

k=minimum(closedge);

//求出加入生成树的下一个顶点(k)printf(closedge[k].Adjvex,G.vexs[k]);

//输出生成树上一条边

closedge[k].Lowcost=0;//第k顶点并入U集

for(j=0;j<G.vexnum;++j)//修改其它顶点到生成树的最小边

if(G.arcs[k][j]<closedge[j].Lowcost)closedge[j]={G.vexs[k],G.arcs[k][j]};

编辑ppt第71

页7.4图的最小生成树普里姆算法的性能 设n是图的顶点数,普鲁姆算法的时间复杂度为O(n2)。 与边数无关,适用于求边稠密的网的最小生成树。编辑ppt第72

页7.4图的最小生成树克鲁斯卡尔(Kruskal)算法 设连通网N=(V,{E})。

1)初始时最小生成树只包含图的n个顶点,每个顶点为一棵子树; 2)选取权值较小且所关联的两个顶点不在同一子树的边,将此边加入到最小生成树中;

3)重复2)n-1次,即得到包含n个顶点和n-1条边的最小生成树。编辑ppt第73

页7.4图的最小生成树克鲁斯卡尔(Kruskal)算法566154V3V1V4V6V5V2365216543212345编辑ppt7.4克鲁斯卡尔算法构造非连通图ST=(V,{});

k=i=0;//k计选中的边数

while(k<n-1){

++i;

检查边集E中第i条权值最小的边(u,v);

若(u,v)加入ST后不使ST中产生回路,

则输出边(u,v);且k++;}编辑ppt123456第75

页7.4图的最小生成树克鲁斯卡尔(Kruskal)算法16543212345datajihe124536124536vexhweight112213233544vextflag61535500000001342567893345566664260000111114211122222采用边集数组的形式保存图:566154V3V1V4V6V5V23652编辑ppt第76

页7.4图的最小生成树克鲁斯卡尔的性能 设图的边数是e,克鲁斯卡尔算法的时间复杂度为O(eloge)。

适用于求边稀疏的网的最小生成树。编辑ppt第77

页7.4图的最小生成树两种算法比较普里姆算法克鲁斯卡尔算法时间复杂度O(n2)O(eloge)稠密图稀疏图算法名适应范围编辑ppt7.5重连通图和关节点定义:若从一个连通图中删去一个顶点及其相关联的边,连通图成为两个或多个连通分量,则该点称为关节点。定义:若从一个连通图中删去任意一个顶点及其相关联的边,它仍为一个连通图的话,则该连通图被称为重(双)连通图。ahgcbfde双连通图中没有关节点没有关节点的连通图为双连通图编辑ppt7.5重连通图和关节点abcdefgh对G进行深度优先遍历,得到深度优先生成树T虚线表示回边:即在G中但不在T中的边,是遍历时选择

已访问的邻接点ahgcbfde编辑ppt关节点的特征特征1:若生成树的根结点,有两个或两个以上的分支,则此顶点(生成树的根)必为关节点;ahgcbfdeabcdefgh编辑ppt特征2:对生成树上的任意一个“顶点”,若某棵子树的根或子树中的其它“顶点”没有和其祖先相通的回边,则该“顶点”必为关节点。如何判断节点满足特征2?ahgcbfde关节点的特征abcdefgh编辑pptabcdefgh23456783311111设置visited[v]:顶点在DFS中的序号;设置low[v]:顶点v在DFS中所能访问到的的节点最小序号(包括回边)1low[v]=Min{visited[v],low[w],visited[k]}w是顶点v在DFS树上的子节点;k是顶点v在DFS树上回联的祖先节点;如何判断节点满足特征2?ahgcbfde编辑ppt如何判断节点满足特征2?条件:1)顶点v存在孩子节点w;2)visited[v]<=low[w];ahgcbfdeabcdefgh234567833111111编辑ppt第84

页7.5有向无环图——拓扑排序有向无环图(DAG) 没有回路的有向图。含有公共子式的表达式

(a+b)*(e/f)-(a+b)-a+b*/efa+b-a+b*/ef编辑ppt第85

页7.5有向无环图——拓扑排序问题提出:学生选修课程问题 顶点——表示课程 有向弧——表示先决条件,若课程i

课程j

的先决条件,则图中有弧<i,j>。

学生应按怎样的顺序学习这些课程,才能无矛盾、顺利地完成学业——拓扑排序。

很显然,不能出现回路。编辑ppt第86

页7.5有向无环图——拓扑排序拓扑排序C1C2C3C4C5C6C7C8C9C10C11C12课程代号课程名称先修课C1程序设计基础无C2离散数学C1C3数据结构C1,C2C4汇编语言C1C5语言的设计和分析C3,C4C6计算机原理C11C7编译原理C3.C5C8操作系统C3,C6C9高等数学无C10线性代数C9C11普通物理C9C12数值分析C1,C9,C10编辑ppt第87

页7.5有向无环图——拓扑排序有向无环图(DAG)某工程可分为7个子工程,工程流程图。V4V3V2V6V5V1V7编辑ppt第88

页7.5有向无环图——拓扑排序定义

AOV网——用顶点表示活动,用弧表示活动间优先关系的有向图称为顶点表示活动的网(ActivityOnVertexnetwork),简称AOV网。

<vi,vj>是图中有向边,则

vi

vj

的直接前驱;vj

vi

的直接后继。 AOV网中不允许有回路,因为回路意味着某项活动以自己为先决条件。编辑ppt第89

页7.5有向无环图——拓扑排序拓扑排序

把AOV网络中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程。

检测AOV网中是否存在环方法:对有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环。编辑ppt第90

页7.5有向无环图——拓扑排序拓扑排序的方法

在有向图中选一个没有前驱的顶点且输出之。

从图中删除该顶点和所有以它为尾的弧。

重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止。编辑ppt第91

页7.5有向无环图——拓扑排序拓扑排序C1C2C3C4C5C6C7C8C9C10C11C12拓扑序列:C1--C2--C3--C4--C5--C7--C9--C10--C11--C6--C12--C8或:C9--C10--C11--C6--C1--C12--C4--C2--C3--C5--C7--C8一个AOV网的拓扑序列不是唯一的编辑ppt第92

页7.5有向无环图——拓扑排序拓扑排序C1C2C3C4C5C6C7C8C9C10C11C12拓扑序列:C1编辑ppt第93

页7.5有向无环图——拓扑排序拓扑排序C1C2C3C4C5C6C7C8C9C10C11C12拓扑序列:C1编辑ppt第94

页7.5有向无环图——拓扑排序拓扑排序C2C3C4C5C6C7C8C9C10C11C12拓扑序列:C1--C2编辑ppt第95

页7.5有向无环图——拓扑排序拓扑排序C2C3C4C5C6C7C8C9C10C11C12拓扑序列:C1--C2编辑ppt第96

页7.5有向无环图——拓扑排序拓扑排序C3C4C5C6C7C8C9C10C11C12拓扑序列:C1--C2--C3编辑ppt第97

页7.5有向无环图——拓扑排序拓扑排序C3C4C5C6C7C8C9C10C11C12拓扑序列:C1--C2--C3编辑ppt第98

页7.5有向无环图——拓扑排序拓扑排序C4C5C6C7C8C9C10C11C12拓扑序列:C1--C2--C3--C4编辑ppt第99

页7.5有向无环图——拓扑排序拓扑排序C4C5C6C7C8C9C10C11C12拓扑序列:C1--C2--C3--C4编辑ppt第100

页7.5有向无环图——拓扑排序拓扑排序C5C6C7C8C9C10C11C12拓扑序列:C1--C2--C3--C4--C5编辑ppt第101

页7.5有向无环图——拓扑排序拓扑排序C5C6C7C8C9C10C11C12拓扑序列:C1--C2--C3--C4--C5编辑ppt第102

页7.5有向无环图——拓扑排序拓扑排序C6C7C8C9C10C11C12拓扑序列:C1--C2--C3--C4--C5--C7编辑ppt第103

页7.5有向无环图——拓扑排序拓扑排序C6C7C8C9C10C11C12拓扑序列:C1--C2--C3--C4--C5--C7编辑ppt第104

页7.5有向无环图——拓扑排序拓扑排序C6C8C9C10C11C12拓扑序列:C1--C2--C3--C4--C5--C7--C9编辑ppt第105

页7.5有向无环图——拓扑排序拓扑排序C6C8C9C10C11C12拓扑序列:C1--C2--C3--C4--C5--C7--C9编辑ppt第106

页7.5有向无环图——拓扑排序拓扑排序C6C8C10C11C12拓扑序列:C1--C2--C3--C4--C5--C7--C9--C10编辑ppt第107

页7.5有向无环图——拓扑排序拓扑排序C6C8C10C11C12拓扑序列:C1--C2--C3--C4--C5--C7--C9--C10--C11--C6--C12--C8编辑ppt第108

页7.5有向无环图——拓扑排序拓扑排序算法实现 以邻接表作存储结构。 把邻接表中所有入度为0的顶点进栈。 栈非空时,输出栈顶元素Vj并退栈;在邻接表中查找Vj的直接后继

Vk,把

Vk的入度

减1;若

Vk的入度为

0

则进栈。

重复上述操作直至栈空为止。

若栈空时输出的顶点个数不是

n,则有向图有环;否则,拓扑排序完毕。 (实现过程见教材P182)编辑ppt第109

页7.5有向无环图——拓扑排序拓扑排序32104例1234560122inlink

5

5

4

3^^^vexnext3^

2

5^

2

40123456^top16toptop编辑ppt第110

页7.5有向无环图——拓扑排序拓扑排序0122inlink

5

5

4

3^^^vexnext3^

2

5^

2

40123456^输出序列:63210416toptopp2编辑ppt第111

页7.5有向无环图——拓扑排序拓扑排序0122inlink

5

5

4

3^^^vexnext3^

2

5^

2

40123456^输出序列:63210416topp21编辑ppt第112

页7.5有向无环图——拓扑排序拓扑排序0122inlink

5

5

4

3^^^vexnext3^

2

5^

2

40123456^输出序列:63210416P=NULL21top1编辑ppt第113

页7.5有向无环图——拓扑排序拓扑排序0112inlink

5

5

4

3^^^vexnext3^

2

5^

2

40123456^输出序列:63210416P20top1编辑ppt第114

页7.5有向无环图——拓扑排序拓扑排序0112inlink

5

5

4

3^^^vexnext3^

2

5^

2

40123456^输出序列:63210446P20top1编辑ppt第115

页7.5有向无环图——拓扑排序拓扑排序0112inlink

5

5

4

3^^^vexnext3^

2

5^

2

40123456^输出序列:63210446P20top10编辑ppt第116

页7.5有向无环图——拓扑排序拓扑排序0112inlink

5

5

4

3^^^vexnext3^

2

5^

2

40123456^输出序列:63210443P20top10编辑ppt第117

页7.5有向无环图——拓扑排序拓扑排序0112inlink

5

5

4

3^^^vexnext3^

2

5^

2

40123456^输出序列:63210443P20top101P=NULL编辑ppt第118

页7.5有向无环图——拓扑排序拓扑排序0112inlink

5

5

4

3^^^vexnext2^

2

5^

2

40123456^输出序列:63210443P10top1013编辑ppt第119

页7.5有向无环图——拓扑排序拓扑排序0111inlink

5

5

4

3^^^vexnext2^

2

5^

2

40123456^输出序列:63210443P10top1003编辑ppt第120

页7.5有向无环图——拓扑排序拓扑排序0111inlink

5

5

4

3^^^vexnext2^

2

5^

2

40123456^输出序列:63210442P10top1003P=NULL编辑ppt第121

页7.5有向无环图——拓扑排序拓扑排序0111inlink

5

5

4

3^^^vexnext2^

2

5^

2

40123456^输出序列:6321044210top1003P=NULL2编辑ppt第122

页7.5有向无环图——拓扑排序拓扑排序0111inlink

5

5

4

3^^^vexnext1^

2

5^

2

40123456^输出序列:632104400top1003P24编辑ppt第123

页7.5有向无环图——拓扑排序拓扑排序0111inlink

5

5

4

3^^^vexnext1^

2

5^

2

40123456^输出序列:632104500top1003P24编辑ppt第124

页7.5有向无环图——拓扑排序拓扑排序0111inlink

5

5

4

3^^^vexnext1^

2

5^

2

40123456^输出序列:632104500top1003P=NULL24编辑ppt第125

页7.5有向无环图——拓扑排序拓扑排序0111inlink

5

5

4

3^^^vexnext1^

2

5^

2

40123456^输出序列:63210400top1003P=NULL245编辑ppt第126

页7.5有向无环图——关键路径问题提出: 1)工程能否顺序进行,即工程流程是否“合理”

2)完成整项工程至少需要多少时间,哪些子工程是影响工程进度的关键子工程?V3V1V4V6V5V2a4=3a1=3a2=2a6=3a5=4a3=2a7=2a8=1顶点表示事件边表示活动事件Vj发生表示

ak已结束ak

VjVi事件Vi发生表示

ak可以开始

AOE网编辑ppt第127

页7.5有向无环图——关键路径AOE网

AOE——用边表示活动的网。它是有一个带权的有向无环图。 顶点——表示事件,弧——表示活动, 权值——活动持续的时间。

路径长度——路径上各活动持续时间之和

关键路径——路径长度最长的路径叫关键路径编辑ppt第128

页7.5有向无环图——关键路径AOV网和AOE网的区别 都能用来表示工程中的各子工程的流程: 一个用顶点表示活动, 一个用边表示活动, 但AOV网侧重表示活动的前后次序,AOE网除表示活动先后次序,还表示了活动的持续时间等。 因此可利用AOE网解决工程所需最短时间及哪些子工程拖延会影响整个工程按时完成等问题。编辑pptabcdefghk64521182446147“关键活动”指的是:该弧上的权值增加将使有向图上的最长路径的长度增加。整个工程完成的时间为:从有向图的源点到汇点的最长路径。源点汇点77.5有向无环图——关键路径编辑ppt如何求关键活动?“活动(弧)”的最早开始时间e(i)“活动(弧)”的最迟开始时间l(i)关键活动:e(i)=l(i)“事件(顶点)”的最早发生时间ve(j)“事件(顶点)”的最迟发生时间vl(k)活动(弧)发生时间的计算公式假设第i条弧为<j,k>,则对第i项活动言e(i)=ve(j);l(i)=vl(k)–dut(<j,k>);jkiabce641161编辑ppt事件(顶点)发生时间的计算公式最早开始时间:ve(源点)=0;ve(k)=Max{ve(j)+dut(<j,k>)}最迟开始时间:vl(汇点)=ve(汇点);vl(j)=Min{vl(k)–dut(<j,k>)}如何求关键活动?abce641161jki编辑ppt13200000000064571157151418181818181818181818161486610807拓扑有序序列:a-d-f-c-b-e-h-g-k如何求关键活动?abcdefghk64521182447编辑ppt1330645771514181814161078660000645777151414160236688710e(i)=ve(j);l(i)=vl(k)–dut(<j,k>);编辑ppt134算法的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论