图
图的定义和术语:
- 图G由顶点集V和关系集E组成,记为: G=(V,E)
– V是顶点(元素)的有穷非空集, E是两个顶点之间的关系的集合。 - 若图G任意两顶点a,b之间的关系为有序对<a,b>,<a,b>∈E,
则称<a,b>为从a到b的一条弧/有向边;
–其中: a是<a,b>的弧尾, b是<a,b>的弧头; 称该图G是有向图。
G1={V1,E1},
V1={A,B,C,D,E}, E1={<A,C>,<A,D>,<C,D>,<B,E>,<E,B>} - 若图G的任意两顶点a,b之间的关系为无序对(a,b), 则称(a,b)为无向边(边),称该图G是无向图。 无向图可简称为图。
G2={V2,E2},
V2={1,2,3,4,5,6}, E2={(1,3),(1,5),(3,5),(4,6)}
一些特殊的图
1.完全图----有n个顶点和n(n-1)/2条边的无向图
2.有向完全图----有n个顶点和n(n-1)条弧的有向图
3.网(Network)----边(弧)上加权(weight)的图。
- 对图 G=(V,E)和G’=(V’,E’),
若V’属于V 且 E’属于E,则称G’是G的一个子图
- 与顶点x相关联的边(x,y)的数目,称为x的度,
记作TD(x) 或D(x), - 以顶点x为弧尾的弧<x,y>的数目,
称为x的出度,记作OD(x)。 - 以顶点x为弧头的弧<y,x>的数目,
称为x的入度,记作ID(x) - 若从顶点vi到vj有路径,则称vi和vj是连通的。
- 若图G中任意两顶点是连通的,则称G是连通图。
- 若图G’是G的一个极大连通子图则称G’是G的一个连通分量。(连通图的连通分量是自身)
对有向图G
● 若在图G中,每对顶点vi和vj之间, 从vi到vj,且从 vj到vi存在路径,则称G是强连通图。
● 若图G’是G的一个极大强连通子图,则称G’是G的一个强连通分量。(强连通图的强连通分量是自身)
例如:下图G12是强连通图,但非极大故非强连通分量。
- 设G=(V,E),G’=(V’,E’),V=V’,若G是连通图,
G’是G的一个极小连通子图,(非极大即可) 则G’是G的一棵生成树。
- 若有向图G有且仅有一个顶点的入度为0,其余顶点的入度
为1,则G是一棵有向树。
- 有向图的生成树/生成森林。(结合树那章的概念)
图的存储结构
1.数组表示法/邻接矩阵
- 顶点数组—用一维数组存储顶点(元素)
- 邻接矩阵—用二维数组存储顶点(元素)之间的关系(边或弧)
2.邻接表、逆邻接表 : 链式存储结构。
(1) 无向图的邻接表 :
为图G的每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边。
- 若无向图G有n个顶点和e条边,需n个表头结点和2e个表结点。
无向图G的邻接表,顶点vi的度为第i个单链表的长度。
(2)有向图的邻接表 :
第i个单链表中的表结点,表示以顶点vi为尾的弧(vi,vj)的弧头。
- 若有向图G有n个顶点和e条弧,则需n个表头结点和e个表结点。
有向图G的邻接表,顶点vi的出度为第i个单链表的长度。
求顶点vi的入度需遍历全部单链表,统计结点值为i的结点数。(麻烦)
(3)有向图的逆邻接表:
第i个单链表中的表结点,表示以顶点vi为头的弧(vi,vj)的弧尾。
- 若有向图G有n个顶点e条弧,则需n个表头结点和e个表结点。
有向图G的逆邻接表,顶点vi的入度为第i个单链表的长度。
求顶点vi的出度需遍历全部单链表,统计结点值为i的结点数。(改进)
(4)有向网的邻接表
3.有向图的十字链表。–将邻接表和逆邻接表合并而成的链接表。
- 以邻接表为基础,扩展结点属性成起止结点序号
再添加逆邻接表信息
4.邻接多重表
- (无向图的)的另一种链式存储结构
- (1)图的一个顶点用一个“头结点”表示, 其中:
data域 :存储和该顶点相关的信息,
firstedge域 :存储第一条依附于该顶点的边。
- (2)图的一条边用一个“结点”表示,
其中:
mark----标志域,可用以标记该条边是否被搜索过;
vi和vj----该条边依附的两个顶点在图中的位置;
vilink----指向下一条依附于顶点vi的边;
vjlink----指向下一条依附于顶点vj的边。
避免了无向图邻接表的一条边用两个结点。
图的遍历
从图G的某定点vi出发,访问G的每个顶点一次且一次的过程。
1.图的深度优先搜索----DFS—Depth First Search
2.图的广(宽)度优先搜索----BFS—Breadth First Search
3.生成树
- DFS的生成树
- BFS的生成树
- 假定从A出发BFS遍历图G:
4.生成森林 - DFS的生成森林
- BFS的生成森林
5.网的最小生成树-----在网G的各生成树中,其中各边的权之和最小的生成树称为G的最小生成树。
- MST性质:设G=(V,E)是一个连通图,通过某种算法构造其最小生成树,T=(U,TE)是正在构造的最小生成树。如果边(u,v)是G中所有一端在U中(即u∈U)而另一端在V-U中(即v∈V-U)具有最小值的一条边,则必存在一棵包含边(u,v)的最小生成树。
1.普里姆(prim)算法 以选顶点为主
- 对n个顶点的连通网,初始时, T=(U,TE),U为一个开始顶点,TE=φ,以后根据MST性质,每次增加一个顶点和一条边,重复n-1次。U不断增大,V-U不断减小直到为空。
例:从A出发
- 另一棵最小生成树:从D出发