数据结构-第四部分.ppt
《数据结构-第四部分.ppt》由会员分享,可在线阅读,更多相关《数据结构-第四部分.ppt(191页珍藏版)》请在三一办公上搜索。
1、1,第12章 图的基本概念,图的定义图的术语图的运算图的存储图的遍历图遍历的应用,2,图的定义,图可以用G=(V,E)表示。其中,V是顶点的集合,E是连接顶点的边(弧)的集合。如果边是有方向的,称为有向图。有向图的边用表示。表示从A出发到B的一条边。在有向图中,和是不一样的。如果边是无方向的,称为无向图。无向图的边通常用圆括号表示。(A,B)表示顶点A和B之间有一条边。无向图也称为双向图。加权图:边被赋予一个权值的图称为加权图。如果图是有向的,称为加权有向图,如果是无向的,称为加权无向图。,3,如G1:V=A,B,C,D,E=,表示的图如下所示,4,V=A,B,C,D,E,E=(A,B),(A
2、,C),(B,D),(B,E),(D,E),(C,E),无向图,5,加权图中边的表示:或(Vi,Vj,W),加权图,6,第12章 图的基本概念,图的定义图的术语图的运算图的存储图的遍历图遍历的应用,7,图的基本术语,邻接:如(Vi,Vj)是图中的一条边,则称Vi和Vj是邻接的。如是图中的一条边,则称Vi邻接到Vj,或Vj和Vi邻接。度:无向图中邻接于某一结点的边的总数。入度:有向图中进入某一结点的边数,称为该结点的入度出度:有向图中离开某一结点的边数,称为该结点的出度,8,子图,A,A,C,D,A,C,A,B,C,D,有向图G1的子图,A,B,C,D,有向图 G1,设有两个图G=(V,E)和G
3、=(V,E),如果,则称G是G的子图,9,无向图 G2,A,B,C,D,E,A,B,D,E,A,A,B,C,D,A,B,C,D,E,无向图G2的子图,10,路径和路径长度,对1 E,那么,w1,w2,wN是图中的一条路径。非加权的路径长度就是组成路径的边数,对于路径w1,w2,wN,非加权路径长度为N-1。加权路径长度是指路径上所有边的权值之和。简单路径和环:如果一条路径上的所有结点,除了起始结点和终止结点可能相同外,其余的结点都不相同,则称其为简单路径。一个回路或环是一条简单路径,其起始结点和终止结点相同,且路径长度至少为1。,11,无向图的连通性,连通:顶点v至v 之间有路径存在连通图:无
4、向图 G 的任意两点之间都是连通的,则称 G 是连通图。连通分量:非连通图中的极大连通子图,12,无向图G,无向图G的三个连通分量,13,有向图的连通性,强连通图:有向图 G 的任意两点之间都是连通的,则称 G 是强连通图。强连通分量:极大连通子图弱连通图:如有向图G不是强连通的,但如果把它看成是无向图时是连通的,则称该图是弱连通的,14,有向图G,有向图G的两个强连通分量,不是强连通图。因为B到其他结点都没有路径。但此图是弱连通的。,15,完全图,完全图:每两个节点之间都有边的无向图称为完全图。完全图有 n(n-1)/2 条边的无向图。其中 n 是结点个数。即有向完全图:每两个节点之间都有两
5、条弧的有向图称为有向完全图。有向完全图有 n(n-1)条边。其中 n 是结点个数。即如果一个有向图中没有环,则称为有向无环图,简写为DAG,无向完全图,16,生成树,A,B,C,D,E,H,M,A,B,C,D,E,H,M,无向图G,无向图G的生成树,生成树是连通图的极小连通子图。包含图的所有 n 个结点,但只含图的 n-1 条边。在生成树中添加一条边之后,必定会形成回路或环。,17,第12章 图的基本概念,图的定义图的术语图的运算图的存储图的遍历图遍历的应用,18,图的运算,常规操作:构造一个由若干个结点、若干条边组成的图;判断两个结点之间是否有边存在;在图中添加或删除一条边;返回图中的结点数
6、或边数;按某种规则遍历图中的所有结点。和应用紧密结合的运算:拓扑排序找最小生成树找最短路径等。,19,图的抽象类,template class graph public:virtual bool insert(int u,int v,TypeOfEdge w)=0;virtual bool remove(int u,int v)=0;virtual bool exist(int u,int v)const=0;virtual numOfVer()const return Vers;virtual numOfEdge()const return Edges;protected:int Vers,
7、Edges;,20,第12章 图的基本概念,图的定义图的术语图的运算图的存储图的遍历图遍历的应用,21,图的存储,邻接矩阵和加权邻接矩阵邻接表,22,邻接矩阵有向图,设有向图具有 n 个结点,则用 n 行 n 列的布尔矩阵 A 表示该有向图如果i 至 j 有一条有向边,Ai,j=1,如果 i 至 j 没有一条有向边,Ai,j=0,表示成右图矩阵,0 1 1 00 0 0 00 0 0 11 0 0 0,注意:出度:i行之和。入度:j列之和。,23,邻接矩阵有向图,表示成右图矩阵,0 1 1 00 0 0 00 0 0 11 0 0 0,在物理实现时的考虑:分别用 0、1、2、3 分别标识结点A
8、、B、C、D。而将真正的数据字段之值放入一个一维数组之中。,0 1 2 3,0123,D,A,B,C,0 1 2 3,24,邻接矩阵无向图,设无向图具有 n 个结点,则用 n 行 n 列的布尔矩阵 A 表示该无向图;并且 Ai,j=1,如果i 至 j 有一条无向边;Ai,j=0如果 i 至 j 没有一条无向边,表示成右图矩阵,0 1 1 0 01 0 0 1 11 0 0 0 10 1 0 0 10 1 1 1 0,在物理实现时的考虑,和前一页的无向图类似。,注意:无向图的邻接矩阵是一个对称矩阵 i 结点的度:i 行或 i 列之和。,25,加权的邻接矩阵有向图,设有向图具有 n 个结点,则用
9、n 行 n 列的矩阵 A 表示该有向图;如果i 至 j 有一条有向边且它的权值为a,则Ai,j=a。如果 i 至 j 没有一条有向边。则Ai,j=空 或其它标志,表示成右图矩阵,a b b ba a,26,邻接矩阵的特点,优点:判断任意两点之间是否有边方便,仅耗费 O(1)时间。缺点:即使 n2 条边,也需内存 n2 单元,太多;仅读入数据耗费 O(n2)时间,太长。而大多数的图的边数远远小于n2。,27,邻接矩阵类的定义,template class adjMatrixGraph:public graph public:adjMatrixGraph(int vSize,const TypeO
10、fVer d,TypeOfEdge noEdgeFlag);bool insert(int u,int v,TypeOfEdge w);bool remove(int u,int v);bool exist(int u,int v)const;adjMatrixGraph();private:TypeOfEdge*edge;/存放邻接矩阵TypeOfVer*ver;/存放结点值TypeOfEdge noEdge;/邻接矩阵中的的表示值;,28,构造函数,template adjMatrixGraph:adjMatrixGraph(int vSize,const TypeOfVer d,Type
11、OfEdge noEdgeFlag)int i,j;Vers=vSize;Edges=0;noEdge=noEdgeFlag;/存放结点的数组的初始化 ver=new TypeOfVervSize;for(i=0;ivSize;+i)veri=di;,29,/邻接矩阵的初始化 edge=new TypeOfEdge*vSize;for(i=0;ivSize;+i)edgei=new TypeOfEdgevSize;for(j=0;jvSize;+j)edgeij=noEdge;,30,析构函数,template adjMatrixGraph:adjMatrixGraph()delete ver
12、;for(int i=0;iVers;+i)delete edgeidelete edge;,31,Insert函数,template bool adjMatrixGraph:insert(int u,int v,TypeOfEdge w)if(u Vers-1|v Vers-1)return false;if(edgeuv!=noEdge)return false;edgeuv=w;+Edges;return true;,32,Remove函数,template bool adjMatrixGraph:remove(int u,int v)if(u Vers-1|v Vers-1)retur
13、n false;if(edgeuv=noEdge)return false;edgeuv=noEdge;-Edges;return true;,33,Exist函数,template bool adjMatrixGraph:exist(int u,int v)const if(u Vers-1|v Vers-1)return false;if(edgeuv=noEdge)return false;else return true;,34,图的存储,邻接矩阵和加权邻接矩阵邻接表,35,邻接表,设有向图或无向图具有 n 个结点,则用结点表、边表表示该有向图或无向图。结点表:用数组或单链表的形式存放
14、所有的结点值。如果结点数n已知,则采用数组形式,否则应采用单链表的形式。边表(边结点表):每条边用一个结点进行表示。同一个结点出发的所有的边形成它的边结点单链表。,36,无向图 G2,有向图 G1,37,邻接表的特点,邻接表是图的标准存储方式优点:内存 结点数 边数,处理时间也是结点数 边数,即为O(|V|+|E|)。当我们谈及图的线性算法时,一般指的是O(|V|+|E|)缺点:确定 i-j 是否有边,最坏需耗费 O(n)时间。无向图同一条边表示两次。边表空间浪费一倍。有向图中寻找进入某结点的边,非常困难。,38,邻接表类的定义,template class adjListGraph:publ
15、ic graph public:adjListGraph(int vSize,const TypeOfVer d);bool insert(int u,int v,TypeOfEdge w);bool remove(int u,int v);bool exist(int u,int v)const;adjListGraph();,39,private:struct edgeNode/邻接表中存储边的结点类int end;/终点编号TypeOfEdge weight;/边的权值edgeNode*next;edgeNode(int e,TypeOfEdge w,edgeNode*n=NULL)en
16、d=e;weight=w;next=n;struct verNode/保存顶点的数据元素类型TypeOfVer ver;/顶点值edgeNode*head;/对应的单链表的头指针verNode(edgeNode*h=NULL)head=h;verNode*verList;,40,构造函数,template adjListGraph:adjListGraph(int vSize,const TypeOfVer d)Vers=vSize;Edges=0;verList=new verNodevSize;for(int i=0;i Vers;+i)verListi.ver=di;,41,析构函数,t
17、emplate adjListGraph:adjListGraph()int i;edgeNode*p;for(i=0;i next;delete p;delete verList;,42,Insert函数,template bool adjListGraph:insert(int u,int v,TypeOfEdge w)verListu.head=new edgeNode(v,w,verListu.head);+Edges;return true;,43,Remove函数,template bool adjListGraph:remove(int u,int v)edgeNode*p=ve
18、rListu.head,*q;if(p=NULL)return false;/结点u没有相连的边 if(p-end=v)/单链表中的第一个结点就是被删除的边 verListu.head=p-next;delete p;-Edges;return true;while(p-next!=NULL,44,Exist函数,template bool adjListGraph:exist(int u,int v)const edgeNode*p=verListu.head;while(p!=NULL,45,第12章 图的基本概念,图的定义图的术语图的运算图的存储图的遍历图遍历的应用,46,邻接矩阵有向图
19、,设有向图具有 n 个结点,则用 n 行 n 列的布尔矩阵 A 表示该有向图如果i 至 j 有一条有向边,Ai,j=1,如果 i 至 j 没有一条有向边,Ai,j=0,表示成右图矩阵,0 1 1 00 0 0 00 0 0 11 0 0 0,注意:出度:i行之和。入度:j列之和。,47,有向图 G1,邻接表有向图,设有向图或无向图具有 n 个结点,则用结点表、边表表示该有向图或无向图。,48,邻接表有向图,编号0,49,图的遍历,深度优先搜索广度优先搜索,对有向图和无向图进行遍历是按照某种次序系统地访问图中的所有顶点,并且使得每个顶点只能被访问一次。在图中某个顶点可能和图中的多个顶点邻接并且存
20、在回路,因此在图中访问一个顶点u之后,在以后的访问过程中,又可能再次返回到顶点u,所以图的遍历要比树的遍历更复杂,50,深度优先搜索,1、选中第一个被访问的顶点;2、对顶点作已访问过的标志;3、依次从顶点的未被访问过的第一个、第二个、第三个 邻接顶点出发,进行深度优先搜索;4、如果还有顶点未被访问,则选中一个起始顶点,转向2;5、所有的顶点都被访问到,则结束。,51,从结点5开始进行深度优先的搜索,则遍历序列可以为:5,7,6,2,4,3,1,也可以为:5,6,2,3,1,4,7。,深度优先生成树,52,深度优先生成森林,在进行深度优先搜索 DFS 时,有时并不一定能够保证从某一个结点出发能访
21、问到所有的顶点在这种情况下,必须再选中一个未访问过的顶点,继续进行深度优先搜索。直至所有的顶点都被访问到为止。这时,得到的是一组树而不是一棵树,这一组树被称为深度优先生成森林。,53,从结点1开始深度优先搜索,54,深度优先搜索的实现,深度优先搜索DFS的实现方法和树的前序遍历算法类似,但必须对访问过的顶点加以标记dfs函数不需要参数,也没有返回值。它从编号最小的结点出发开始搜索,并将对当前对象的深度优先搜索的序列显示在显示器上。,55,深度优先搜索的实现,以邻接表为例设置一个数组visited,记录节点是否被访问过设计一个私有的深度优先搜索的函数,从某一节点出发访问所有可达节点如果是无向非连
22、通图的或有向非强连通,则对图中尚未访问的节点反复调用深度优先搜索,形成深度优先搜索的森林。,56,公有的dfs函数,void dfs()对每个节点 v visited v=false;while(v=尚未访问的节点)dfs(v,visited);,57,template void adjListGraph:dfs()constbool*visited=new boolVers;for(int i=0;i Vers;+i)visitedi=false;cout 当前图的深度优先遍历序列为:endl;for(i=0;i Vers;+i)if(visitedi=true)continue;dfs(i
23、,visited);cout endl;,58,私有的dfs,void dfs(v,visited)visitedv=true;for 每个 v的邻接点w if(!Visitedw)dfs(w,visited);,访问从结点v出发可以访问到的所有结点,59,template void adjListGraph:dfs(int start,bool visited)const edgeNode*p=verListstart.head;cout end=false)dfs(p-end,visited);p=p-next;,60,对图调用dfs,结果为:当前图的深度优先搜索序列为:1 2 4 37
24、6即对应于左图的深度优先生成森林,61,时间性能分析,dfs函数将对所有的顶点和边进行访问,因此它的时间代价和顶点数|V|及边数|E|是相关的,即是O(|V|+|E|)。如果图是用邻接矩阵来表示,则所需要的时间是O(|V|2)。,62,图的遍历,深度优先搜索广度优先搜索,对有向图和无向图进行遍历是按照某种次序系统地访问图中的所有顶点,并且使得每个顶点只能被访问一次。在图中某个顶点可能和图中的多个顶点邻接并且存在回路,因此在图中访问一个顶点u之后,在以后的访问过程中,又可能再次返回到顶点u,所以图的遍历要比树的遍历更复杂,63,广度优先搜索 BFS,1、选中第一个被访问的顶点;2、对顶点作已访问
25、过的标志;3、依次访问已访问顶点的未被访问过的第一个、第二个、第三个第 m 个邻接顶点 W1、W2、W3 Wm,进行访问且进行标记,转向3;4、如果还有顶点未被访问,则选中一个起始顶点,转向2;5、所有的顶点都被访问到,则结束。,广度优先搜索类似于树的从树根出发的按照层次的遍历。它的访问方式如下:,64,按照顶点序号小的先访问,序号大的后访问的原则,则它的广度优先访问序列为:1,2,4,3,5,6,7。对应的广度优先生成森林为,65,从不同的结点开始可以得到不同的搜索序列。例如,从5开始广度优先搜索这个图,得到的遍历序列为:5,6,7,2,4,3,1。,1,2,4,3,5,6,7,66,广度优
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第四 部分
链接地址:https://www.31ppt.com/p-6296814.html