数据结构与算法—赵玉兰 第章 图.ppt

数据结构与算法—赵玉兰 第章 图

图的基本操作: 对顶点的操作 定位、访问、插入、删除 获得指定顶点的邻接点 对边(或弧)的操作 插入、删除 对图的操作 创建、删除、遍历(深度优先、广度优先) 6.2 图的存储结构 图有以下几种常用的存储结构: 邻接矩阵表示法:无向图、有向图 邻接表表示法:无向图、有向图 邻接多重表表示法:无向图 十字链表表示法:有向图 int FirstAdjVex(int v) { if(ghead[v]-firstout) //书上没有此行代码 return ghead[v]-firstout.adjvex; else return -1; //书上没有此行代码 } //FirstAdjVex 每个边结点包含五个域: mark是标志域,标记该边是否被遍历过; vex1与vex2是该边所关联的两个顶点在图中的序号; link1是指向下一条与顶点vex1相关联的边; link2是指向下一条与顶点vex2相关联的边。 每个表头结点仍包含两个域: data存放该顶点的相关信息(如:顶点在图中的编号); firstEdge是指向第一条与该顶点相关联的边。 每个弧结点包含五个域: mark是标志域,标记该边是否被遍历过; hvex表示该弧的起点在图中的位置(序号); tvex表示该弧的终点在图中的位置(序号); hink是指向起点相同的下一条弧; tink是指向终点相同的下一条弧。 每个表头结点包含三个域: data存放该顶点的相关信息(如:顶点在图中的编号); firstin是指向该顶点为终点的第一个弧结点; firstout是指向该顶点为起点的第一个弧结点。 6.3 图的遍历 图的遍历:从图中某一顶点出发,按照某种搜索路径访问图中的所有顶点,使得每个顶点被访问且仅被访问一次。 图的两种遍历方法: 深度优先遍历(Depth-First Search, DFS) 广度优先遍历(Breadth-First Search, BFS) 两种遍历方法对无向图和有向图都适用。 6.3.1 深度优先遍历 深度优先遍历的基本思想: 首先,从图中某一顶点v开始,先访问v; 其次,从顶点v出发,访问它的第一个邻接点w1; 然后,再从顶点w1出发,访问与w1邻接但还未被访问过的顶点w2; 6.3.1 深度优先遍历 深度优先遍历的基本思想: 重复上述过程,直到某一顶点的所有邻接点都被访问过,则退回到上一步访问过的顶点,并查看该顶点是否还有未被访问过的邻接点。 如果有,则访问其邻接点,之后再进行与前述类似的访问; 如果没有,则再往上退一步进行查看。 直到图中所有顶点都被访问完为止。 6.3.1 深度优先遍历 例:以顶点A为起点进行深度优先遍历。 6.3.1 深度优先遍历 为了保证图中每个顶点只被访问一次,需要设置一个辅助数组visited[n](n是图中顶点的个数): 数组元素的初值均为0(False),表示对应顶点未被访问过; 在图的遍历过程中,一旦某一个顶点Vi被访问,就把其对应的数组元素visited[i]置为1(True)。 图的深度优先遍历算法如下: void DFSTraverse( ) { //深度优先遍历算法 int visited[n]; //开辟访问标志数组 for (v=0; vn; v++) visited[v]=0; //初始化访问标志数组 for (v=0; vn; v++) if (!visited[v]) DFS(v); //每次从尚未访问过的顶点中 //选取一个顶点v,从顶点v出发调用DFS(v) } //DFSTraverse 深度优先算法的时间复杂度: 设有n个顶点,e条边(或弧)的无(或有)向图。 如果用邻接矩阵存储图:(邻接矩阵与e无关) 在DFSTraverse( )函数中,初始化visited数组所需时间为O(n),并调用n次DFS( )函数; 在DFS( )函数中,需要遍历邻接矩阵的一行才能得到邻接点,因此循环将执行n次; 综上,无向图深度优先遍历算法的时间复杂度为O(n)+O(n*n)=O(n+n2),即:O(n2)。 有向图的深度优先遍历算法的时间复杂度也为O(n2)。 深度优先算法的时间复杂度: 设有n个顶点,e条边(或弧)的无(或有)向图。 如果用邻接表存储图: 在DFSTraverse( )函数中,初始化visited数组所需时间为O(n),并调用n次DFS( )函数; 在DFS( )函数中,每个顶点对应链表中边结点的个数为该顶点的度,因此循环将执行D

文档评论(0)

1亿VIP精品文档

相关文档