第六章:图

本文详细介绍了图的基本概念,包括无向图、有向图、顶点度、连通性等,并深入探讨了图的存储方式如邻接矩阵、邻接表等。此外,还讲解了图的遍历算法如广度优先遍历(BFS)和深度优先遍历(DFS),以及最小生成树的Prim算法和Kruskal算法。最后,文章涉及最短路径算法,如BFS、Dijkstra和Floyd算法,并简要讨论了有向无环图、拓扑排序和关键路径等相关概念。
摘要由CSDN通过智能技术生成

第六章:图

一、图的基本概念

图G由顶点集V和边集E组成,记为G = (V, E)。

其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)集合。

若V = {v1, v2, … , vn},则用|V|表示图G中顶点的个数,也称图G的阶,E = {(u, v) | u∈V, v∈V},用|E|表示图G中边的条数。

注意:线性表可以是空表,树可以是空树,但图不可以是空,即V一定是非空集

若E是无向边(简称 边)的有限集合时,则图G为无向图;边是顶点的无序对,记为(v, w)或(w, v)。

若E是有向边(也称 弧)的有限集合时,则图G为有向图;弧是顶点的有序对,记为<v, w>。

简单图

① 不存在重复边;

② 不存在顶点到自身的边

(本章只讨论简单图)

多重图

图G中某两个结点之间的边数多于一条,又允许顶点通过同一条边和自己关联,则G为多重图

顶点的度、入度、出度

对于无向图

顶点v的度是指依附于该顶点的边的条数,记为TD(v)。

所有顶点的度之和等于 2|E|

对于有向图

入度是以顶点v为终点的有向边的数目,记为ID(v);

出度是以顶点v为起点的有向边的数目,记为OD(v)。

顶点v的度等于其入度和出度之和,即TD(v) = ID(v) + OD(v)。

所有顶点的入度之和 = 所有顶点的出度之和 = |E|

顶点- 顶点的关系描述

  • 路径——顶点Vp到顶点Vq之间的一条路径是指顶点序列

  • 回路——第一个顶点和最后一个顶点相同的路径称为回路或环

  • 简单路径——在路径序列中,顶点不重复出现的路径称为简单路径。

  • 简单回路——除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路称为简单回路。

  • 路径长度——路径上边的数目

  • 点到点的距离——从顶点u出发到顶点v的最短路径若存在,则此路径的长度称为从u到v的距离。若从u到v根本不存在路径,则记该距离为无穷(∞)。

  • 无向图中,若从顶点v到顶点w有路径存在,则称v和w是连通

  • 有向图中,若从顶点v到顶点w和从顶点w到顶点v之间都有路径,则称这两个顶点是强连通

连通图、强连通图

若图G中任意两个顶点都是连通的,则称图G为连通图,否则称为非连通图

对于n个顶点的无向图G,

若G是连通图,则最少有 n-1 条边,

若G是非连通图,则最多可能有 (n-1)(n-2)/2 条边

若图中任何一对顶点都是强连通的,则称此图为强连通图

对于n个顶点的有向图G,若G是强连通图,则最少有 n 条边(形成回路)

子图、生成子图

设有两个图G = (V, E)和G‘ = (V’, E‘),若V¢是V的子集,且E’是E的子集,则称G‘是G的子图
若有满足V(G’) = V(G)的子图G‘,则称其为G的生成子图

连通分量、强连通分量

极大连通子图:子图必须连通,且包含尽可能多的顶点和边

极大强连通子图:子图必须强连通,同时保留尽可能多的边

无向图中的极大连通子图称为连通分量, 有向图中的极大强连通子图称为有向图的强连通分量

生成树

连通图生成树包含图中全部顶点的一个极小连通子图(边要在连通的前提下尽可能少)。
若图中顶点数为n,则它的生成树含有 n-1 条边。对生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会形成一个回路。

生成森林

非连通图中,连通分量的生成树构成了非连通图的生成森林。

边的权、带权图/网

边的权——在一个图中,每条边都可以标上具有某种含义的数值,该数值称为该边的权值。

带权图/网——边上带有权值的图称为带权图,也称网。

带权路径长度——当图是带权图时,一条路径上所有边的权值之和,称为该路径的带权路径长度

几种特殊的图

无向完全图——无向图中任意两个顶点之间都存在边

有向完全图——有向图中任意两个顶点之间都存在方向相反的两条弧

稀疏图——边数很少的图

稠密图——边数很多的图

(没有绝对的界限,一般来说,|E| < |V|log|V|时,可以将G视为稀疏图 )

——不存在回路,且连通的无向图

有向树——一个顶点的入度为0、其余顶点的入度均为1的有向图,称为有向树。

二、图的存储

1.邻接矩阵

A B C
A 0 1(A和B之间存在边) 0
B 1(B和A之间存在边) 0 1
C 0 1 0
#define  MaxVertexNum 100                   //顶点数目的最大值
typedef struct{
   
    char Vex[MaxVertexNum];                 //顶点表
    //也可以用bool或枚举类型来表示边
    int Edge[MaxVertexNum][MaxVertexNum];   //邻接矩阵,边表
    int vexnum,arcnum;                      //图的当前顶点数和边数/弧数
}MGraph;

邻接矩阵的空间复杂度只和顶点数相关,适合用于存储稠密图。

无向图

第i个结点的度 = 第i行(或第i列)的非零元素个数

有向图

第i个结点的出度 = 第i行的非零元素个数

第i个结点的入度 = 第i列的非零元素个数

第i个结点的度 = 第i行、第i列的非零元素个数之和

邻接矩阵法存储带权图(网)

存在边——边上的权值。

不存在边——用∞来表示,在代码中,可以用int的上限来表示“无穷”。

邻接矩阵的性质

设图G的邻接矩阵为A(矩阵元素为0/1),则 A^n 的元素 A^n[i][j] 等于由顶点 i 到顶点 j 的长度为 n 的路径的数目(说明i)

2.邻接表

(顺序+链式存储)

data first
(0)A ->(1)B ->(2)C [存在A指向B与A指向C的边]
(1)B ->(0)A
(2)C ->(0)A

边的先后顺序可以改变,所以邻接表表示方法并不唯一。

邻接表适合用于稀疏图

3.十字链表

存储有向图

①画邻接表

②增加弧结点的域

③自己指向自己

顶点结点 data firstin firstout
数据域 该顶点作为弧头的第一条弧 该顶点作为弧尾的第一条弧
弧结点 同头 同尾
弧尾顶点编号 弧头顶点编号 弧头相同的下一条弧 弧尾相同的下一跳弧
用箭头指(没有就空^) 用箭头指(没有就空^)

4.邻接多重表

存储无向图

顶点结点 data firstedge
数据域 与该顶点相连的第一条边(用箭头指)
弧结点 i iLink j jLink
边的顶点编号 依附于顶点 i 的下一条边 边的顶点编号 依附于顶点 j 的下一条边
用箭头连线(没有就空^) 用箭头连线(没有就空^)

三、图的基本操作

Adjacent(G,x,y):判断图G是否存在边<x, y>或(x, y)。

Neighbors(G,x):列出图G中与结点x邻接的边。

InsertVertex(G,x):在图G中插入顶点x。

DeleteVertex(G,x):从图G中删除顶点x。

AddEdge(G,x,y):若无向边(x, y)或有向边<x, y>不存在,则向图G中添加该边。

RemoveEdge(G,x,y):若无向边(x, y)或有向边<x, y>

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值