数据结构第七章图严蔚敏幻灯片.ppt
《数据结构第七章图严蔚敏幻灯片.ppt》由会员分享,可在线阅读,更多相关《数据结构第七章图严蔚敏幻灯片.ppt(134页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构第七章图严蔚敏第1页,共134页,编辑于2022年,星期六第六章 图第六章 图知 识 点图的逻辑结构特征及图的基本术语邻接矩阵和邻接表两种图的存储结构的特点及适用范围深度优先搜索和广度优先搜索两种遍历算法的特点和执行过程生成树和最小生成树的概念及构造最小生成树的prim和kruskal算法最短路径的含义及求最短路径的算法拓扑排序的基本思想和步骤关键路径法及其在管理科学中的作用第2页,共134页,编辑于2022年,星期六第六章 图难 点图的遍历、最小生成树、最短路径、拓朴排序算法的理解关键路径法求关键活动和关键路径的方法要 求 熟练掌握以下内容:图的存储结构图的遍历算法 了解以下内容:图
2、的最小生成树和求最小生成树算法的基本思想带权有向图的最短路径问题利用AOV网络的拓朴排序问题利用AOE网络的关键路径法第3页,共134页,编辑于2022年,星期六第六章 图第六章目录7.1 图的定义和基本术语7.2 图的存储方式7.3 图的遍历7.4 最小生成树7.5 最短路径7.6 拓扑排序7.7 关键路径法7.8 应用实例与分析小 结习题与练习第4页,共134页,编辑于2022年,星期六第六章 图7.1 图的定义和基本术语图:图G由V(G)和E(G)这两个集合所组成,记为G=(V,E),其中V(G)是顶点(Vertex)的非空集,每个顶点可以标以不同的字符或数字;E(G)是边(Edge)的
3、集合,特殊情况下E(G)可以是空集。每个边由其所连接的两个顶点表示。无向图:对于一个图G,若边集合E(G)为无向边的集合,则称该图为无向图。有向图:对于一个图G,若边集合E(G)为有向边的集合,则称该图为有向图。第5页,共134页,编辑于2022年,星期六第六章 图图7.1 有向图与无向图无向图G1有向图有向图G2第6页,共134页,编辑于2022年,星期六第六章 图完全图:在一个有n个顶点的无向图中,若每个顶点到其它(n-1)个顶点都连有一条边,则图中共有n(n-1)/2条边,这种图称为完全图(Complete graph,也称完备图)。左图所示就是左图所示就是n=4的完全图,它一共的完全图
4、,它一共有六条边。有六条边。第7页,共134页,编辑于2022年,星期六第六章 图权和网络:有些图,对应每条边有一相应的数值,这个数值叫做该边的权(Weight)。边上带权的图称为带权图,也称为网络(Network)。子图:设有两个图G=(V,E)和G=(V,E),若V(G)是V(G)的子集,且E(G)是E(G)的子集,则称G是G的子图(Subgraph)。例如图7.3所示的图是图7.1中G1的一些子图。第8页,共134页,编辑于2022年,星期六第六章 图图7.3 子图第9页,共134页,编辑于2022年,星期六第六章 图顶点的度:图中与每个顶点相连的边数,叫该顶点的度(Degree)。例如
5、图7.1的图G1中,顶点的度数为2,顶点的度数为3,。入度、出度:对于有向图,顶点的度分为入度和出度,入度是以该顶点为终点的入边数目;出度是以该顶点为起点的出边数目,该顶点的度等于其入度和出度之和。例如在图7.1的图G2中,顶点的入度为1,出度为2,而顶点的入度为1,出度为0,因为有一条边指向它,而没有边从它指出去。第10页,共134页,编辑于2022年,星期六第六章 图路径:在一个图中,若从某顶点Vp出发,沿一些边经过顶点V1,V2,Vm到达,Vq,则称顶点序列(Vp,V1,V2,Vm,Vq)为从Vp到Vq的路径(Path)。路径长度:对于无权的图,路径长度指的是沿此路径上边的数目;对于有权
6、图,一般是取沿路径各边的权之和作为此路径的长度。若一条路径上各顶点均不重复,即路径经过每一顶点不超过一次,则此路径叫做简单路径。如果从一个顶点出发又回到该顶点,即Vp与Vq相同,则此路径叫做环路(Cycle)。第11页,共134页,编辑于2022年,星期六第六章 图连通、连通图:在无向图中,如果从顶点Vi到顶点Vj之间有路径,则称这两个顶点是连通的。如果图中任意一对顶点都是连通的,则称此图是连通图(Connected graph)。连通分量:例如图7.1中的图G1是连通图。图7.4中的图就是非连通图,非连通图的每一个极大连通子图叫连通分量(Connected Component),此图包括二个
7、连通分量。第12页,共134页,编辑于2022年,星期六第六章 图图7.4 非连通图G第13页,共134页,编辑于2022年,星期六第六章 图强连通图和强连通分量:在有向图G中,如果从顶点Vi到顶点Vj和从顶点Vj到顶点Vi之间都有路径,则称这两个顶点是强连通的。如果图中任何一对顶点都是强连通的,则此图叫做强连通图。非强连通图的每一个极大强连通子图叫做强连通分量。图7.1中的G2不是强连通图,它有两个强连通分量,如图7.5所示。第14页,共134页,编辑于2022年,星期六第六章 图图7.5 图G2的强连通分量返回第15页,共134页,编辑于2022年,星期六第六章 图7.2.1 邻接矩阵邻接
8、矩阵是表示顶点之间相邻关系的矩阵。所谓两顶点的相邻关系即它们之间有边相连。邻接矩阵是一个(nn)阶方阵,n为图的顶点数,它的每一行分别对应图的各个顶点,它的每一列也分别对应图的各个顶点。我们规定矩阵的元素为:第16页,共134页,编辑于2022年,星期六第六章 图图7.7 无向图的邻接矩阵第17页,共134页,编辑于2022年,星期六第六章 图图7.7 有向图的邻接矩阵第18页,共134页,编辑于2022年,星期六第六章 图无向图的邻接矩阵是对称的,如果Ai,j=1,必有Aj,i=1。这说明,只输入和存储其上三角阵元素即可得到整个邻接矩阵。一般有向图的邻接矩阵是不对称的,Ai,j不一定等于Aj
9、,i。邻接矩阵用二维数组即可存储,定义如下:int adjmatrix=ARRAYnn;如果图的各边是带权的,只需将矩阵中的各个1元素换成相应边的权即可。第19页,共134页,编辑于2022年,星期六第六章 图产生无向图邻接矩阵算法void creatgraph(int adjarray )int i,j,v1,v2,num;scanf(“%d”,&num);/*输入顶点数*/if(num0)for(i=1;i=num;i+)for(j=1;j=num;j+)adjarry ij=0;/*矩阵初始化*/do 第20页,共134页,编辑于2022年,星期六第六章 图产生无向图邻接矩阵算法续 sc
10、anf(“%d,%d”,&v1,&v2);/*输入边*/adjarrayv1v2=1;adjarrayv2v1=1;while(v1!=0&v2!=0);else num=0;retrun num;第21页,共134页,编辑于2022年,星期六第六章 图7.2.2 邻接表邻接表是图的一种链接存储结构。在邻接表结构中,对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于该顶点Vi的边,即对于无向图每个结点表示与该顶点相邻接的一个顶点;对于有向图则表示以该顶点为起点的一条边的终点。一个图的邻接矩阵表示是唯一的,但其邻接表表示是不唯一的。因为在邻接表的每个单链表中,各结点的顺序是任意的。第2
11、2页,共134页,编辑于2022年,星期六第六章 图图7.8 邻接表图7.7中无向图对应的邻接表第23页,共134页,编辑于2022年,星期六第六章 图图7.7中有向图对应的邻接表第24页,共134页,编辑于2022年,星期六第六章 图邻接表中每个表结点均由两个域组成,其一是邻接点域(adjvex),用以存放与顶点Vi相邻接的顶点在图中的位置;其二是链域(next),用以指向依附于顶点Vi的下一条边所对应的结点。如果用邻接表存放网络中的信息,则还需要在结点中增加一个存放权值的域。在每个链表设一表头结点,一般这些表头结点本身以向量的形式存储。第25页,共134页,编辑于2022年,星期六第六章
12、图对于无向图的邻接表来说,一条边对应两个单链表结点,邻接表结点总数是边数的2倍。在无向图的邻接表中,各顶点对应的单链表的结点数(不算表头结点)就等于该顶点的度数。在有向图邻接表中,一条弧对应一个表结点,表结点的数目和弧的数目相同。在有向图邻接表中,单链表的结点数就等于相应顶点的出度数。要求有向图中某顶点的入度数,需扫视邻接表的所有单链表,统计与顶点标号相应的结点个数。第26页,共134页,编辑于2022年,星期六第六章 图邻接表存储结构定义#define MAXVEX 30 struct edgenode int adjvex;/*邻接点域*/struct edgenode*next;/*链域
13、*/;struct vexnode char data;/*顶点信息*/struct edgenode*link;typedef struct vexnode adjlistMAXVEX;第27页,共134页,编辑于2022年,星期六第六章 图产生无向图的邻接表算法void creategraph(adjlist g)int e,i,s,d,n;struct edgenode*p;printf(“请输入结点数(n)和边数(e):n”);scanf(“%d,%d”,&n,&e);for(i=1;i=n;i+)printf(“n请输入第%d个顶点信息:”,i);scanf(“%c”,&gi.dat
14、a);gi.link=NULL;for(i=1;i=e;i+)第28页,共134页,编辑于2022年,星期六第六章 图产生无向图的邻接表算法续 printf(“n请输入第%d条边起点序号,终点序号:”,i);scanf(“%d,%d”,&s,&d);p=(struct edgenode*)malloc(sizeof(edgenode);padjvex=d;/*邻接点序号为d*/pnext=gs.link;gs.link=p;/*将新结点插入顶点Vs边表的头部*/p=(struct edgenode*)malloc(sizeof(edgenode);padjvex=s;/*邻接点序号为s*/pn
15、ext=gd.link;gd.link=p;/*将新结点插入顶点Vd边表的头部*/返回第29页,共134页,编辑于2022年,星期六第六章 图7.3.1 深度优先搜索(DFS)首先访问图中某指定起始点Vi,然后由Vi出发访问它的任一相邻接顶点Vj,再从Vj出发访问Vj的任一未访问过的相邻接顶点Vk,再从Vk出发进行类似访问,如此进行下去,直到某顶点已没有未被访问过的相邻接顶点时,则退回一步,退到前一个顶点,找前一个顶点的其它尚未被访问的相邻接顶点。如有未访问过的相邻接顶点,则访问此顶点后,再从该顶点出发向前进行与前述类似的访问;如退回一步后,前一顶点也没有未被访问过的相邻接顶点,则再向回退一步
16、进行搜索,重复上述过程,一直到所有顶点均被访问过为止。第30页,共134页,编辑于2022年,星期六第六章 图图7.9 图的遍历例子第31页,共134页,编辑于2022年,星期六第六章 图由于图中的路径可能有环路,为了避免重复访问某些顶点,设计图的搜索算法时,可设置一个表示顶点是否被访问过的辅助数组visited,初始时将数组元素置零,一旦某顶点Vi被访问过,则令visitedVi=1,以后此顶点即不再访问。第32页,共134页,编辑于2022年,星期六第六章 图深度优先搜索算法深度优先搜索是一种递归的过程,可以简单地将其表示成递归的形式,其算法描述如下:DFS(V0)访问V0顶点;visit
17、edV0=1;对所有与V0相邻接的顶点w if(visitedw=0)DFS(w);第33页,共134页,编辑于2022年,星期六第六章 图邻接表表示的图的DFS算法 int visitedMAXVEX;void dfsgraph(adjlist adj,int n)int i;for(i=1;i=n;i+)visitedi=0;/*给visited数组赋初值*/for(i=1;i=n;i+)if(!visitedi)dfs(adj,i);第34页,共134页,编辑于2022年,星期六第六章 图从Vi出发进行DFS的递归算法void dfs(adjlist adj,int v)struct e
18、dgenode*p;visitedv=1;printf(“%d”,v);p=adjvlink;while(p!=NULL)if(visitedpadjvex=0)dfs(adjlist,padjvex);/*从v未访问的邻接点出发进行DFS*/p=pnext;第35页,共134页,编辑于2022年,星期六第六章 图时间复杂性分析一个有n个顶点、e条边的图,在深度优先搜索图的过程中,找邻接点所需时间为O(e)。对辅助数组初始化时间为O(n)。因此,当用邻接表作为图的存储结构时,深度优先搜索图的时间复杂性为O(e+n)。第36页,共134页,编辑于2022年,星期六第六章 图非递归算法从顶点Vi出
19、发进行深度优先遍历的递归过程也可以写成非递归的形式,此时需借助一个堆栈保存被访问过的结点,以便回溯时查找已被访问结点的未被访问过的邻接点。设堆栈由一个一维数组构成,数组名为stack,栈顶指针为top,假设此数组足够大,不必考虑溢出的可能。第37页,共134页,编辑于2022年,星期六第六章 图非递归算法#define MAXVEX 100void dfs(adjlist g,int v,int n)/*从顶点v出发进行深度优先遍历*/struct vexnode *stackMAXVEX,*p;int visitedMAXVEX,top=0;for(i=1;i0|p!=NULL)第38页,共
20、134页,编辑于2022年,星期六第六章 图非递归算法续 while(p!=NULL)if(visitedp-adjvex=1)p=p-next;else printf(“%d”,p-adjvex);visitedp-adjvex=1;top+;stacktop=p;p=gp-adjvex.link;第39页,共134页,编辑于2022年,星期六第六章 图非递归算法续 if(top0)top-;/*退栈,回溯查找已被访问结点的未被访问过的邻接点*/p=stacktop;p=p-next;第40页,共134页,编辑于2022年,星期六第六章 图7.3.2 广度优先搜索(BFS)图的广度优先搜索(
21、BFS)类似于树的按层次遍历。广度优先搜索的基本思想是:首先访问图中某指定的起始点Vi并将其标记为已访问过,然后由Vi出发访问与它相邻接的所有顶点Vj、Vk,并均标记为已访问过,然后再按照Vj、Vk的次序,访问每一个顶点的所有未被访问过的邻接顶点,并均标记为已访问过,下一步再从这些顶点出发访问与它们相邻接的尚未被访问的顶点,如此做下去,直到所有的顶点均被访问过为止。第41页,共134页,编辑于2022年,星期六第六章 图在广度优先搜索中,若对顶点V1的访问先于顶点V2的访问,则对V1邻接顶点的访问也先于V2邻接顶点的访问。就是说广度优先搜索中对邻接点的寻找具有“先进先出”的特性。因此,为了保证
22、访问顶点的这种先后关系,需借助一个队列暂存那些刚访问过的顶点。设此队列由一个一维数组构成,数组名为Queue,队首指针和队尾指针分别为front和rear。假设数组足够大,不必考虑有溢出的可能性。广度优先搜索不是递归过程,不能用递归形式。第42页,共134页,编辑于2022年,星期六第六章 图BFS算法描述BFS(v0)访问v0顶点;visitedv0=1;被访问过的顶点入队;当队列非空时,进行下面的循环 (1)被访问过的顶点出队;(2)对所有与该顶点相邻接的顶点w if(visitedw=0)(a)访问w顶点;(b)visitedw=1;(c)w入队;第43页,共134页,编辑于2022年,
23、星期六第六章 图邻接表表示的图的BFS算法int visitedMAXVEX;int queueMAXVEX;void bfs(adjlist adj,int v)int front=0,rear=1,v;struct edgenode*p;visitedv=1;printf(“%d”,v);queuerear=v;/*初始顶点入队*/while(front!=rear)/*队列不为空*/第44页,共134页,编辑于2022年,星期六第六章 图邻接表表示的图的BFS算法续 front=front+1;v=queuefront;/*按访问次序出队列*/p=adjv-link;/*找v的邻接顶点*
24、/while(p!=NULL)if(visitedp-adjvex=0)visitedp-adjvex=1;printf(“%d”,p-adjvex);第45页,共134页,编辑于2022年,星期六第六章 图邻接表表示的图的BFS算法续 rear=rear+1;queuerear=p-adjvex;p=p-next;第46页,共134页,编辑于2022年,星期六第六章 图时间复杂性分析一个有n个顶点、e条边的图,在广度优先搜索图的过程中,每个顶点至多进一次队列,图的搜索过程实质上是通过边来找顶点的过程,找邻接点所需时间为O(e)。对辅助数组初始化时间为O(n)。因此,当用邻接表作为图的存储结构
25、时,广度优先搜索图的时间复杂性为O(e+n)。返回第47页,共134页,编辑于2022年,星期六第六章 图7.4 最小生成树在一个无向连通图G中,如果取它的全部顶点和一部分边构成一个子图G,若边集E(G)中的边刚好将图的所有顶点连通但又不形成环路,我们就称子图G是原图G的生成树(Spanning tree)。生成树有如下特点:任意两个顶点之间有且仅有一条路径;如果再增加一条边就会出现环路;如果去掉一条边此子图就会变成非连通图。一个有n 个顶点的完全图,一共存在n(n-2)种不同的生成树。第48页,共134页,编辑于2022年,星期六第六章 图对于带权的连通图(连通网)G,其生成树也是带权的。我
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第七 章图严蔚敏 幻灯片
限制150内