图
图形结构——多个对多个
图:G=(V,E)
V:顶点(数据元素)的有穷非空集合;
E:边的有穷集合。
无向图:每条边都是无方向的
有向图:每条边都是有方向的
完全图:任意两个点都有一条边相连
稀疏图:有很少边或弧的图(e<nlogn)。
稠密图:有较多边或弧的图。
网:边/弧带权的图。
邻接:有边/弧相连的两个顶点之间的关系。
存在(Vi,v;),则称v;和V;互为邻接点;
存在<Vi,Vi>,则称v;邻接到vj,V;邻接于Vi
关联(依附):边/弧与顶点之间的关系。
存在(Vi,Vi)/<Vi,Vi>,则称该边/弧关联于v;和Vi
顶点的度:与该顶点相关联的边的数目,记为TD(v)
在有向图中,顶点的度等于该顶点的入度与出度之和。
顶点v的入度是以v为终点的有向边的条数,记作ID(v)
顶点v的出度是以v为始点的有向边的条数,记作OD(v)
路径:接续的边构成的顶点序列。
路径长度:路径上边或弧的数目/权值之和。
回路(环):第一个顶点和最后一个顶点相同的路径。
简单路径:除路径起点和终点可以相同外,其余顶点均不相同的路径。
简单回路(简单环):除路径起点和终点相同外,其余顶点均不相同的路径。
连通图(强连通图)
在无(有)向图G=(V,{E})中,若对任何两个顶点v、u
都存在从v到u的路径,则称G是连通图(强连通图)。
权:
图中边或弧所具有的相关数称为权。表明从一个顶点到另一个顶点的距离或耗费。
网:
带权的图称为网。
子图
设有两个图G=(V,(E)、G1=(V1,(E1),若V1cV,E1CE,则称G1是G的子图。
连通分量(强连通分量):
无向图G的极大连通子图称为G的连通分量。
极大连通子图意思是:该子图是G连通子图,将G的任何不在该子图中的顶点加入,子图不再连通。
极小连通子图:该子图是G的连通子图,在该子图中删除任何一条边子图不再连通。边的数目最少删除一条边不再连通
生成树:包含无向图G所有顶点的极小连通子图。
生成森林:对非连通图,由各个连通分量的生成树的集合。
图的抽象类型定义
图的存储结构
邻接矩阵(数组)表示法
邻接矩阵的存储表示:用两个数组分别存储顶点表和邻接矩阵
特点:
邻接表(链式)表示法
特点:
** 邻接矩阵与邻接表表示法的关系**
图的遍历
- 遍历定义:
从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。 - 遍历实质:找每个顶点的邻接点的过程。有路才能到达
- 图的特点:
图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。 - 怎样避免重复访问?(计算机是模拟现实世界,生活中你会怎么避免重复访问过了就做个标记)
解决思路:设置辅助数组visited[n],用来标记每个被访问过的顶点
·初始状态visited门为0
·顶点i被访问,改visited门为1,防止被多次访问
图常用的遍历:
深度优先搜索(Depth_First Search——DFS)
- DFS算法效率分析
用邻接矩阵来表示图,遍历图中每一个顶点都要从头扫描该顶点所在行,时间复杂度为O(m2)。
用邻接表来表示图,虽然有2e个表结点,但只需扫描e个结点即可
完成遍历,加上访问个头结点的时间,时间复杂度为O(n+e)。 - 结论:
·稠密图适于在邻接矩阵上进行深度遍历;
·稀疏图适于在邻接表上进行深度遍历。
广度优先搜索(Breadth_Frist Search——BFS)
图的应用
最小生成树
最小生成树可能不唯一
最短路径
-
问题抽象:在有向网中A点(源点)到达B点(终点)的多条路径中,寻找一条各边权值之和最小的路径,即最短路径。
-
最短路径与最小生成树不同,路径上不一定包含n个顶点,也不一定包含n-1条边。
-
单源最短路径–迪杰斯特拉
-
所有定点间最短路径----弗罗伊得
-
迪杰斯特拉
-
弗洛伊德算法
算法思想:
· 逐个顶点试探
· 从v;到v的所有可能存在的路径中
· 选出一条长度最短的路径
拓扑排序和关键路径
针对有向无环图:无环的有向图,简称DAG图(Directed Acycline Graph)
-
拓扑排序
在AOV网没有回路的前提下,我们将全部活动排列成一个线性序列,使得若AOV网中有弧<i,j>存在,则在这个序列中,i一定排在j的前面,具有这种性质的线性序列称为拓扑有序序列,相应的拓扑有序排序的算法称为拓扑排序。
-
关键路径