数据结构 图

本文介绍了图数据结构的基础概念,包括有向图、无向图、完全图、度、子图等,并探讨了图的存储方式如邻接矩阵和邻接表。此外,还讨论了图的遍历、生成树、最小生成树的构造算法如Prim和Kruskal,最短路径问题的Dijkstra和Floyd算法,以及拓扑排序和关键路径在AOE网中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图的基本概念
1.概念 图由一个非空点集V和一个边的集合E组成的一种数据结构,可以用二元组定义为:G=(V, E)。
2.有向图和无向图 在图中,若用箭头标明了边是有方向性的,则称这样的图为有向图,否则称为无向图。在无向图中,一条边(x, y)与(y, x)表示的结果相同,用圆括号表示。在有向图中,一条边< x,y >与< y,x >表示的结果不相同,用尖括号表示。< x,y >表示从顶点x指向顶点y的边,x为始点,y为终点。有向边也称为弧, x为弧尾, y为弧头。则< x,y >表示为一条弧, 而< y,x >表示y为弧尾, x为弧头的另一条弧 。
3.完全图 具有n个顶点,n(n-1)/2条边的图,称为完全无向图;具有n个顶点,n(n-1)条弧的有向图,称为完全有向图。完全无向图和完全有向图都称为完全图。
4.度 入度 出度 和握手定理 在无向图中,关联于该顶点v的边的数目,称为该顶点的度,记为:D(v)。在有向图中,把以顶点v为终点的边的数目,称为v的入度,记为:ID(v);把以顶点v为始点的边的数目,称为v的出度,记为:OD(v);顶点v的入度和出度之和称为该顶点的度,D(v)=ID(v)+OD(v)。握手定理:度之和为边的两倍(有向图中入度必须等于出度等于边的个数)。5.子图 若有两个图G1和G2,G1=(V1, E1),G2=(V2, E2),满足如下条件: (1)V2包含于V1 (2)E2包含于E1即V2为V1的子集,E2为E1的子集,称图G2为图G1的子图。
6.权和网 图中每一条边都可以附有一个对应的数值,这种与边相关的数据信息称为权。边上带有权的图称为带权图,也称作网。
7.路径和路径长度 路径长度是指一条路径上经过的边的数目。若一条路径上除开始点和结束点可以相同外,其余顶点均不相同,则称此路径为简单路径。
8.回路和简单路径 若一条路径上的开始点与结束点为同一个顶点,则此路径被称为回路或环。开始点与结束点相同的简单路径被称为简单回路或简单环。
9.连通图 在无向图 G=(V,E)中,若从 vi到 vj有路径相通,则称顶点 vi与 vj是连通的。如果对于图中的任意两个顶点 vi、vj∈V,vi,vj都是连通的,则称该无向图 G 为连通图。无向图中的极大连通子图称为该无向图的连通分量。 在有向图 G=(V,E1)中,若对于每对顶点 vi、vj∈V 且 vi≠vj,从 vi 到 vj和 vj到 vi都有路径,则称该有向图为强连通图。有向图的极大强连通子图称做有向图的强连通分量。 ★强连通图只有一个强连通分量,即本身,非强连通图有多个强连通分量。
10.生成树和生成森林 连通图G的生成树,是G的包含其全部n个顶占的一个极小连通子图,它必定包含且仅包含G的n-1条边。 在非连通图G中,由每个连通分量都可以得到一个极小连通子图(一棵生成树)。这些连通分量的生成树就组成了一个非连通图的生成森林。

图的存储
1.邻接矩阵 在邻接矩阵表示中,除了存放顶点本身信息外,还用一个矩阵表示各个顶点之间的关系。若(i,j)∈E(G) 或 < i,j >∈E(G),则矩阵中第i行第j列元素值为1,否则为0 。
2.邻接表 图的邻接矩阵表示法虽然有其自身的优点,但对于稀疏图来讲,用邻接矩阵的表示方法会造成存储空间的很大浪费,为此引入邻接表表示法。邻接表表示法实际上是图的一种链式存储结构,它包括两部分: ①单链表,用来存放边的信息 ②数组,主要用来存放顶点本身的数据信息
优点:空间效率高;容易寻找顶点的邻接点。
缺点:判断两顶点间是否有边或弧,需搜索两结点对应的单链表,没有邻接矩阵方便。图的遍历 为避免同一顶点被多次访问,必须为每个被访问的顶点作一标志。为此引入一辅助数组,记录每个顶点是否被访问过。设置一个全局型标志数组visited[0…n-1 ]来标志某个顶点是否被访问过,未访问的值为 0,访问过的值为 1。
1.深度优先搜索遍历 步骤:首先访问顶点vi,并将其访问标志置为访问过,即visited[i]=1。然后搜索与顶点vi有边相连的下一个顶点vj ,若vj未被访问过,则访问它,并将vj的访问标志置为访问过,visited[j]=1,然后从vj开始重复此过程;若vj已访问,再看与vi有边相连的其它顶点。若与vi有边相连的顶点都被访问过,则退回到前一个访问顶点并重复刚才过程,直到图中所有顶点都被访问完为止。
2.广度优先搜索遍历 步骤:首先访问顶点i,并将其访问标志置为已被访问,即visited[i]=1;接着依次访问与顶点i有边相连的所有顶点W1,W2,…,Wt;然后再按顺序访问与W1,W2,…,Wt有边相连且未曾访问过的顶点;依此类推,直到图中所有顶点都被访问完为止。生成树与最小生成树
1.生成树 连通图G的一个极小连通子图,它含有图中n个顶点,但只有n-1条边。由深度优先搜索遍历得到的生成树,称为深度优先生成树(DFS生成树)。由广度优先搜索遍历得到的生成树,称为广度优先生成树(BFS生成树)。
2.最小生成树 生成树中每条边上权值之和达到最小,称为最小生成树。 构造:必须只使用该网络中的边来构造最小生成树; 必须使用且仅使用n-1条边来联结网络中的n个顶点; 不能使用产生回路的边。
Prim算法 假设G=<V,E>是连通图,TE是G上最小生成树中边的集合。算法从U={u0}(u0∈V),TE={ }开始,任取一个顶点u0作为开始点。重复执行下述操作:在所有u∈U, v∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。注意:选择最小边时,可能有多条同样权值的边可选,此时任选其一。
Kruskar算法 假设G=<V, E>是连通图,则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=<V, { }>。从E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边选择下一条代价最小的边。依次类推,直至T中所有顶点都在同一连通分量上为止。
最短路径
带权图的最短路径是指两点间的路径中边权和最小的路径。
1.Dijkstra算法 思想(1)把图中顶点集合分成两组,第一组为集合S,存放已求出其最短路径的顶点,第二组为尚未确定最短路径的顶点集合是V-S(令W=V-S),其中V为网中所有顶点集合。 (2)按最短路径长度递增的顺序逐个把W中的顶点加到S中,直到S中包含全部顶点,而W为空。 (3)在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到W中任何顶点的最短路径长度。 (4)此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,W中的顶点的距离从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
步骤:(1)初始时,S只包含源点,S={v},v的距离为0。U包含除v外的其他顶点,U中顶点的距离为顶点的权或∞ 。(2)从U中选取一个距离最小的顶点k,把k加入到S中。(3)以k 作为新考虑的中间点,修改 U中各顶点的距离。(4)重复步骤(1)、(2)直到所有顶点都包含在S中。
2.Floyd算法 思想 从任意节点i到任意节点j的最短路径不外乎两种可能,一是直接从i到j,二是从i经过若干个节点k到j。所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。 步骤 (1)从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。    (2)对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它。

拓扑结构与AOV网
1.AOV网 在一个有向图中,若用顶点表示活动,有向边表示活动间先后关系,则称该有向图叫做顶点活动网(Activity On Vertex network),简称为AOV网。在AOV网中,若从顶点i到顶点j之间存在一条有向路径,称顶点i是顶点j的前驱,或者称顶点j是顶点i的后继。若< i,j >∈G(E),则称顶点i是顶点j的直接前驱,顶点j是顶点i的直接后继。
2.拓扑排序 给出有向图G=(V,E),对于V中的顶点的线性序列(vi1,vi2,…,vin),如果满足如下条件:若在G中从顶点 vi到vj有一条路经,则在序列中顶点vi必在顶点 vj之前;则称该序列为 G的一个拓扑序列。构造有向图的一个拓扑序列的过程称为拓扑排序。注意(1)AOV网不一定都有拓扑序列。(2)AOV网中不能出现有向回路(或称有向环)。
关键路径与AOE网
1.AOE网 在带权的有向图中,以顶点表示事件,弧表示活动,权表示活动的开销,则称此带权的有向图为用边表示活动的网络,简称AOE网。在一个表示工程的AOE网中:不存在回路。网中仅存在一个入度为0的顶点,称作源点,它表示了整个工程的开始;网中仅存在一个出度为0的顶点,称为汇点,它表示整个工程的结束。2.关键路径 把从源点到汇点的最长路径称为关键路径,关键路径上的活动称为关键活动。在一个AOE网中,可以有不止一条的关键路径。注意 从源点到汇点时,选择较大的权值。从汇点到源点时,选择较小的权值。来回均相同的路径就是关键路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值