数据结构(CC++语言版)第六章new课件.ppt
《数据结构(CC++语言版)第六章new课件.ppt》由会员分享,可在线阅读,更多相关《数据结构(CC++语言版)第六章new课件.ppt(99页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1.图的基本概念图的基本概念2.2.图的存储结构图的存储结构3.3.图的遍历图的遍历4.4.最小生成树最小生成树5.5.最短路径最短路径6.6.拓扑排序拓扑排序7.7.关键路径关键路径1问题问题n假设要在假设要在n个城市之间建立通信网。令图个城市之间建立通信网。令图G的的顶点表示城市,边表示连接两个城市的通信顶点表示城市,边表示连接两个城市的通信线路,边的权值表示通信线路的长度或代价。线路,边的权值表示通信线路的长度或代价。在在n个城市间构造通信网最少需要个城市间构造通信网最少需要n-1条线路,条线路,问:如何选择这问:如何选择这n-1条边,使得构造这个通信条边,使得构造这个通信网总的代价最小
2、?网总的代价最小?21 1、熟悉图的各种存储结构、熟悉图的各种存储结构2 2、熟练掌握遍历图的算法、熟练掌握遍历图的算法3 3、应用图的遍历算法求解各、应用图的遍历算法求解各 种简单路径问题种简单路径问题学习要点:学习要点:36.1 图的基本概念图的基本概念定义定义:图是由图是由顶点顶点集合集合(vertex)及及边边的集合组的集合组成的一种数据结构成的一种数据结构:Graph(V,E)其中其中 V=x|x 某个数据对象某个数据对象 是顶点的有穷是顶点的有穷非空集合;非空集合;E=(x,y)|x,y V 是顶点之间关系的有穷集合,也叫做边是顶点之间关系的有穷集合,也叫做边(edge)集集合。例
3、如合。例如:E=,4n n顶点的度顶点的度 一个顶点一个顶点v 的度是与它相关联的的度是与它相关联的边的条数。边的条数。记作记作TD(v)。顶点顶点顶点顶点 v v 的入度的入度的入度的入度 是以是以是以是以 v v 为终点的有向边的条数为终点的有向边的条数为终点的有向边的条数为终点的有向边的条数,记作记作记作记作 ID(ID(v v);顶点顶点顶点顶点 v v 的出度的出度的出度的出度是以是以是以是以 v v 为始点的有向边的条数为始点的有向边的条数为始点的有向边的条数为始点的有向边的条数,记作记作记作记作 OD(OD(v v)。邻接点:邻接点:若(若(vi,vjvi,vj)是一条无向边,则
4、称)是一条无向边,则称顶点顶点vivi和和vjvj互为邻接点互为邻接点。1235687410796671231516ABDCE603045358040756 子图子图子图子图 设有两个图设有两个图设有两个图设有两个图 GG(V V,E E)和和和和 GG(V V,E E)。若。若。若。若 V V V V 且且且且 E E E E,则称则称则称则称 图图图图G G 是是是是 图图图图G G 的子图。的子图。的子图。的子图。7 路径路径路径路径 在图在图在图在图 G G(V V,E E)中中中中,若从顶点若从顶点若从顶点若从顶点 vi vi 出发出发出发出发,沿一些边经过一些顶点沿一些边经过一些顶
5、点沿一些边经过一些顶点沿一些边经过一些顶点 vpvp1 1,vpvp2 2,vpmvpm,到达顶点,到达顶点,到达顶点,到达顶点vj vj。则称顶点序列。则称顶点序列。则称顶点序列。则称顶点序列 (vi vi vpvp1 1 vpvp2.2.vpm vpm vj vj)为从顶点为从顶点为从顶点为从顶点vi vi 到顶点到顶点到顶点到顶点 vj vj 的路径的路径的路径的路径。它经过的边。它经过的边。它经过的边。它经过的边(vi vi,vpvp1)1)、(vpvp1,1,vpvp2)2)、.、(vpmvpm,vj vj)应是属于应是属于应是属于应是属于E E的边。的边。的边。的边。简单路径简单路
6、径简单路径简单路径 若路径上各顶点若路径上各顶点若路径上各顶点若路径上各顶点 v v1,1,v v2,.,2,.,vm vm 均不互相重复均不互相重复均不互相重复均不互相重复,则称这样的路径则称这样的路径则称这样的路径则称这样的路径为简单路径。为简单路径。为简单路径。为简单路径。回路回路回路回路 若路径上第一个顶点若路径上第一个顶点若路径上第一个顶点若路径上第一个顶点 v v1 1 与最后一个顶点与最后一个顶点与最后一个顶点与最后一个顶点vm vm 重合重合重合重合,则称这样的路径则称这样的路径则称这样的路径则称这样的路径为回路或环。为回路或环。为回路或环。为回路或环。路径长度路径长度路径长度
7、路径长度 非带权图的路径长度是指此路径上边的条数。非带权图的路径长度是指此路径上边的条数。非带权图的路径长度是指此路径上边的条数。非带权图的路径长度是指此路径上边的条数。带权图的路径长度是指路径上各边的权之和。带权图的路径长度是指路径上各边的权之和。带权图的路径长度是指路径上各边的权之和。带权图的路径长度是指路径上各边的权之和。81235687410796671231516ABDCE60304535804075权:权:权:权:某些图的边具有与它相关的数某些图的边具有与它相关的数,称之为权。这称之为权。这种带权图叫做网种带权图叫做网。10 生成树生成树 一个连通图的生成树是它的极小一个连通图的生
8、成树是它的极小 连通子图,在连通子图,在n个顶点的情形下,有个顶点的情形下,有n-1条条 边。边。生成森林生成森林n n不予讨论的图不予讨论的图 包含顶点到其自身的边;包含顶点到其自身的边;一条边在图中重复出现一条边在图中重复出现1121435n n邻接矩阵邻接矩阵邻接矩阵邻接矩阵n n顶点矩阵顶点矩阵顶点矩阵顶点矩阵13若若G G是带权的图是带权的图,则邻接矩阵定义为则邻接矩阵定义为:Wi,j若若 或或(vi,vj)E0 0或或 反之反之 Aij=5 9 7 4 G1.arcs=V1V2V3V4有向图有向图G15497有向网有向网G1的邻接矩阵为:的邻接矩阵为:152153462030504
9、07080带权图的邻接矩阵带权图的邻接矩阵16邻接矩阵的实现邻接矩阵的实现(class(class定义定义)C+)C+:template class MGraph public:MGraph(T a,int n,int e);MGraph();MGraph();void dfs(int v);void bfs(int v);private:T vertexMaxsize;int arcMaxsizeMaxsize;int vertexnum,arcnum;18邻接矩阵的构造函数方法一邻接矩阵的构造函数方法一:(无向图无向图)template MGraph:MGraph(T a,int n,in
10、t e)vertexnum=n,arcnum=e;for(i=0;ivertexnum;i+)vertexi=ai;for(i=0;ivertexnum;i+)for(j=0;jvertexnum;j+)arcij=0;for(k=0;kij;arcij=1;arcji=1;19邻接矩阵的构造函数方法二邻接矩阵的构造函数方法二:(无向图无向图)template MGraph:MGraph()cinvexnumarcnum;for(i=0;i vertexi;for(i=0;ivexnum;i+)for(j=0;j vexnum;j+)arcij0;for(k=0;kvivj;i=search(
11、vertex,vi);j=search(vertex,vj);arcij=1;arcji=1;20Status CreateGraph(Mgraph&G)int i,j;AdjType w;VexType v1,v2;/输入顶点数、边数和是否输入边的相关信息的标志 scanf(“%d%d”,&G.vexnum,&G.arcnum);for(i=0;i G.vexnum;i+)/读入所有的顶点 scanf(“%c”,&G.vexsi);for(i=0;i G.vexnum;i+)/初始化邻接矩阵 for(j=0;jarcsij =INFINITY;for(i=0;iarcsij.adj=w;pG
12、-arcsji=pG.arcsij;return OK;/查找某个顶点在图中的存储位置(下标),找不到返回-1int LocateVex(Mgraph&G,VexType vert)int i;for(i=0;ivexsi=vert)return i;return-1;22n基本思想:基本思想:v 如果对图中的所有顶点都建立一个单链表(如果对图中的所有顶点都建立一个单链表(边表边表边表边表)来存储所有依附于该顶点的弧或边,就可以把图中来存储所有依附于该顶点的弧或边,就可以把图中所有已有的弧或边的信息保存下来。所有已有的弧或边的信息保存下来。v对于图中所有顶点还是使用一个一维数组来存放。对于图中
13、所有顶点还是使用一个一维数组来存放。在邻接表表示法中,对于顶点单元在邻接表表示法中,对于顶点单元i,需要存放的内容,需要存放的内容有顶点信息以及指向依附于该顶点的所有的弧或边组有顶点信息以及指向依附于该顶点的所有的弧或边组成的单链表(边表)。成的单链表(边表)。对于边表中弧单元,需要存放该弧指向的顶点的位置对于边表中弧单元,需要存放该弧指向的顶点的位置(也就是该弧依附的另一个顶点的位置)和指向下一(也就是该弧依附的另一个顶点的位置)和指向下一条弧的指针。条弧的指针。二二.邻接表邻接表(Adjacency List)24无向图的邻接表无向图的邻接表 把同一个顶点发出的边链接在同一个边链表中,把同
14、一个顶点发出的边链接在同一个边链表中,链表的每一个结点代表一条边,叫做边结点,链表的每一个结点代表一条边,叫做边结点,结点中保存有与该边相关联的另一顶点的顶点结点中保存有与该边相关联的另一顶点的顶点下标下标 dest 和指向同一链表中下一个边结点的指和指向同一链表中下一个边结点的指针针 link。25有向图的邻接表和逆邻接表有向图的邻接表和逆邻接表 在有向图的邻接表中,第在有向图的邻接表中,第在有向图的邻接表中,第在有向图的邻接表中,第 i i 个边链表链接的边都是个边链表链接的边都是个边链表链接的边都是个边链表链接的边都是顶点顶点顶点顶点 i i 发出发出发出发出的边的边的边的边。也叫做。也
15、叫做。也叫做。也叫做出边表出边表出边表出边表。在有向图的逆邻接表中,第在有向图的逆邻接表中,第在有向图的逆邻接表中,第在有向图的逆邻接表中,第 i i 个边链表链接的边都是个边链表链接的边都是个边链表链接的边都是个边链表链接的边都是进入顶点进入顶点进入顶点进入顶点 i i 的边的边的边的边。也叫做。也叫做。也叫做。也叫做入边表入边表入边表入边表。26网网(带权图带权图)的邻接表的邻接表28邻接表中的结点类型定义:邻接表中的结点类型定义:struct ArcNode int adjvex;ArcNode*next;template struct VertexNode T vertex;ArcNo
16、de*firstedge;29 邻接表的构造函数邻接表的构造函数(方法一方法一):ALGraph:ALGgraph(T a,int n,int e);vexnum=n;arcnum=e;for(i=0;i vexnum;i+)adjlisti.vertex=ai;adjlisti.firstedge NULL;for(k=0;kij;snew ArcNode;s-adjvexj;s-next adjlisti.firstedge;adjlisti.firstedge s;31 邻接表的构造函数邻接表的构造函数(方法二方法二):ALGraph:ALGraph()cinvexnumarcnum;f
17、or(i=0;i adjlisti.vertex;adjlisti.firstedge NULL;for(k=0;kvivj;i=search(adjlist,vi);j=search(adjlist,vj);snew ArcNode;s-adjvexj;s-next adjlisti.firstedge;adjlisti.firstedge s;32 优点:优点:在边稀疏的情况下,节省存储空间在边稀疏的情况下,节省存储空间 易于确定图中任一顶点的度数和它的所易于确定图中任一顶点的度数和它的所有邻接点。有邻接点。缺点:缺点:判定任意两个顶点之间是否有边或弧不判定任意两个顶点之间是否有边或弧不方
18、便。方便。邻接表的优缺点邻接表的优缺点:33n给出其邻接矩阵和邻接表表示。n请画出:(1)以a为起点的一棵深度优先生成树和广度优先生成树。(2)以d为起点的一棵深度优先生成树和广度优先生成树。346.3 图的遍历图的遍历n n概念概念概念概念 从图中某一顶点出发,沿着某条搜索路径访问从图中某一顶点出发,沿着某条搜索路径访问从图中某一顶点出发,沿着某条搜索路径访问从图中某一顶点出发,沿着某条搜索路径访问图中所有的顶点,且使每个顶点仅被访问一次,图中所有的顶点,且使每个顶点仅被访问一次,图中所有的顶点,且使每个顶点仅被访问一次,图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历。就叫做图的遍
19、历。就叫做图的遍历。就叫做图的遍历。n n复杂性复杂性复杂性复杂性图的任一顶点都可能与其它顶点相通,即图中可图的任一顶点都可能与其它顶点相通,即图中可图的任一顶点都可能与其它顶点相通,即图中可图的任一顶点都可能与其它顶点相通,即图中可能存在回路,在访问完某个顶点之后可能会沿着能存在回路,在访问完某个顶点之后可能会沿着能存在回路,在访问完某个顶点之后可能会沿着能存在回路,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。某些边又回到了曾经访问过的顶点。某些边又回到了曾经访问过的顶点。某些边又回到了曾经访问过的顶点。为了避免重复访问,需设置一个标志顶点是否被为了避免重复访问,需设置一个
20、标志顶点是否被为了避免重复访问,需设置一个标志顶点是否被为了避免重复访问,需设置一个标志顶点是否被访问过的辅助数组访问过的辅助数组访问过的辅助数组访问过的辅助数组 visitedvisited ,它的初始状态为它的初始状态为它的初始状态为它的初始状态为 0 0,在图的遍历过程中,一旦某一个顶点,在图的遍历过程中,一旦某一个顶点,在图的遍历过程中,一旦某一个顶点,在图的遍历过程中,一旦某一个顶点 i i 被访问,被访问,被访问,被访问,就立即让就立即让就立即让就立即让 visitedvisited i i 为为为为 1 1,防止它被多次访问。,防止它被多次访问。,防止它被多次访问。,防止它被多次
21、访问。35 类似于树的先根遍历,是树的先根遍历的推广。类似于树的先根遍历,是树的先根遍历的推广。图的深度优先遍历规则:图的深度优先遍历规则:假设初始状态是图中所有顶点都未被访问,则可从图假设初始状态是图中所有顶点都未被访问,则可从图中某个顶点中某个顶点v出发,访问此顶点,然后依次从出发,访问此顶点,然后依次从v的未被访的未被访问的邻接点出发深度优先遍历图,直至所有与问的邻接点出发深度优先遍历图,直至所有与v有通路有通路的顶点都被访问到;的顶点都被访问到;若此时图中还有顶点未被访问到,则另选图中未被访若此时图中还有顶点未被访问到,则另选图中未被访问的顶点作起点,重复上述过程,直到图中所有顶点都问
22、的顶点作起点,重复上述过程,直到图中所有顶点都被访问到为止。被访问到为止。V1V2V3V4V5V8V6V7深度优先搜索深度优先搜索(DFS:Depth First Search)36深度优先搜索的示例深度优先搜索的示例37void DFS(MGraph G,int i)int j;VisitFunc(G.vexsv);/访问第访问第v个顶点个顶点 visitedi=TRUE;/设置访问标志为设置访问标志为TRUE(已访问已访问)for(j=0;jG.vexnum;j+)if(G.arcsij=1&!visitedj)DFS(G,j);图的深度优先搜索算法:图的深度优先搜索算法:图的深度优先搜索
23、算法:图的深度优先搜索算法:Boolean visited MAX;Status (*VisitFunc)(int v);以邻接矩阵表示法作为图的存储结构以邻接矩阵表示法作为图的存储结构连通图:连通图:连通图:连通图:38非连通图:非连通图:void DFSTraverse(MGraph G,Status(*Visit)(VertexType)int v;VisitFunc=Visit;for(v=0;vG.vexnum;v+)visitedv=FALSE;/访问标志数组初始化访问标志数组初始化(未被访问未被访问)for(v=0;vG.vexnum;v+)if(!visitedv)DFS(G,
24、v);/对尚未访问的顶点调用对尚未访问的顶点调用DFS问题:问题:1.如何判断一个图是否是连通的?如何判断一个图是否是连通的?2.如何求出一个非连通图中的连通分量个数?如何求出一个非连通图中的连通分量个数?39例子例子遍历结果:遍历结果:A A、C C、B B、D D40算法分析:算法分析:设图中有设图中有设图中有设图中有 n n 个顶点,个顶点,个顶点,个顶点,e e 条边。条边。条边。条边。如果用邻接矩阵表示图,查找每一个顶点的所有如果用邻接矩阵表示图,查找每一个顶点的所有如果用邻接矩阵表示图,查找每一个顶点的所有如果用邻接矩阵表示图,查找每一个顶点的所有的边,所需时间为的边,所需时间为的
25、边,所需时间为的边,所需时间为O(O(n n),则遍历图中所有的顶点则遍历图中所有的顶点则遍历图中所有的顶点则遍历图中所有的顶点所需的时间为所需的时间为所需的时间为所需的时间为O(O(n n2 2)。如果用邻接表表示图,沿如果用邻接表表示图,沿如果用邻接表表示图,沿如果用邻接表表示图,沿 firstarcfirstarc nextarcnextarc 链可链可链可链可以找到某个顶点以找到某个顶点以找到某个顶点以找到某个顶点 v v 的所有邻接顶点的所有邻接顶点的所有邻接顶点的所有邻接顶点 w w。由于总共由于总共由于总共由于总共有有有有 2 2e e 个边结点,所以扫描边的时间为个边结点,所以
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 CC 语言版 第六 new 课件
限制150内