图
图
图的定义和术语
图的定义
:是一种较线性表和树更为复杂的数据结构。图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。图的术语
:基础定义
:在图中的数据元素一般被称为顶点(Vertex)
,V
是顶点的有穷非空集合;VR
是两个顶点之间的关系的集合;若<v,w>属于VR,则<v,w>表示从v到w的一条弧(Arc)
,且称v为弧尾(Tail)
或初始点
,w为弧头
或终端点
,此时的图称为有向图
.若<v,w>属于VR必有<w,v>属于VR,即VR是对称的,则以无序对
(v,w)代替这两个有序对,表示v和w之间的一条边(Edge)
,此时的图称为无向图
.完全图
:具有[n(n-1)]/2
条边的无向图称为完全图
.有向完全图
:具有[n(n-1)]/2
条弧的有向图.- 有很少条边或弧(e<nlog2n )的图称为
稀疏图
,反之称为稠密图
. 度
:顶点v的度
是和顶点v相关联的边的数目,记为TD(V).以顶点v为头的弧的数目称为v的入度
,以顶点v为尾的弧的数目称为v的出度
.路径
:从v到v'的路径
是一个顶点序列,路径的长度
是路径上的边或弧的数目.回路或环
:第一个顶点和最后一个顶点相同的路径称为回路或环
.简单回路
:序列中顶点不重复出现的回路,称为简单回路
或简单环
.连通图
:若从顶点v到v'有路径,则称v和v'是连通
的,对于图中任意两个顶点都是连通的,则称图是连通图
.连通分量
是指无向图中的极大连通子图
.强连通图
:有向图中,对于每一对顶点都有从v到v'的路径和从v'到v的路径,则称G是强连通图
.有向图中的极大强连通子图
称作有向图的强连通分量
生成树
:是一个极小连通子图
.生成森林
:由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交的有向树的弧.权
:与图和边相关的数叫做权
.
图的储存结构
数组表示法
用两个数组分别储存数据元素的信息和数据元素之间的关系的信息
//-----图的邻接矩阵存储表示-----
#define Maxint 32767
#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
typedef struct{
VerTexType vexs[MVNum] ;//顶点向量
ArcType arcs[MVNum] [MVNum]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和图数.
}AMGraph;
邻接表
邻接表
是图的一种链式储存结构.在邻接表中,对图中的每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对有向图是以顶点v1为尾的弧).每个结点由3个域组成,其中邻接点域(adjvex)指示与顶点vi邻接的点在图中的位置,链域(nextarc)指示下一条边或弧的结点;数据域(info)储存和边或弧相关的信息,如权值等.每个链表上附设一个表头结点.在表头结点中,除了设有链域指向链表中第一个结点之外,还设有储存顶点vi的名或其他有关信息的数据域(data).
//- - - --图的邻接表存储表示- ----
#define MVNum 100 //最大顶点数
typedef struct ArcNode{ //边结点
int adjvex;
struct ArcNode * nextarc;
Otherinfo info;
}ArcNode;
typedef struct VNode {
VerTexType data;
ArcNode *firstarc;
} VNode,AdjList[MVNum];
typedef struct {
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
十字链表
十字链表(OrthogonalList)
是有向图的另一种链式存储结构。可以看成是将有向图的邻接表和逆邻接表结合起来得到的一种链表。在十字链表中,对应千有向图中每一条弧有一个结点,对应千每个顶点也有一个结点。
//- -- - -有向图的十字链表存储表示- ----
#define MAX_ VERTEX_NUM 20
typedef strut ArcBox {
int tailvext,headvex; //该弧的尾和头顶点的位置
struct ArcBox *hlink, *tlink; //分别为弧头相同和弧尾相同的弧的
InfoType *info; //该弧相关信息的指针
}ArcBox;
typedef struct VexNode {
VertexType data;
ArcBox *firstin,*firstout;
}VexNode;
typedef struct{ //分别指向该顶点第一条人弧和出弧
VexNode xlist [MAX_VERTEX_NUM];//表头向扯
int vexnnm, arcnum; //有向图的当前顶点数和弧数
}OLGraph;
邻接多重表
邻接多重表(Adjacency Multilist)
是无向图的另一种链式存储结构。虽然邻接表是无向图的一种很有效的存储结构,在邻接表中容易求得顶点和边的各种信息。但是,在邻接表中每一条边(V;, Vj)有两个结点,分别在第i个和第丿个链表中,这给某些图的操作带来不便。例如在某些图的应用问题中需要对边进行某种操作,如对已被搜索过的边作记号或删除一条边等,此时需要找到表示同一条边的两个结点。因此,在进行这一类操作的无向图的问题中采用邻接多重表作存储结构更为适宜。
//- - - --无向图的邻接多重表存储表示-----
#define MAX_VERTEX_NUM 20
typedef enum{unvisited,visited} Visitlf;
typedef struct EBox{
Visitlf mark;
int ivex, jvex;
struct EBox *ilink, *jlink;
InfoType *info;
} Ebox;
typedef struct VexBox{
VertexType data;
EBox *firstedge;
}VexBox;
typedef struct{
VexBox adjmulist [MAX_VERTEX_NUM];
int vexnum, edgenum;
}AMLGraph;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效