D6-图

本文详细介绍了图的四种存储结构:邻接数组、邻接表、十字链表和邻接多重表,并讨论了图的基本概念,如顶点、边、度数等。此外,还探讨了深度优先搜索(DFS)和广度优先搜索(BFS)及其在寻找最小子树和关键路径等问题中的应用。最后,文章提到了偏序和全序关系在有向图中的体现,以及如何通过拓扑排序检测有向图中的环。
摘要由CSDN通过智能技术生成

目录

邻接数组

邻接表

十字链表

邻接多重表

DFS和BFS

图的重要算法


图是一种多对多的结构

在图中的数据元素通常被称作顶点。V是顶点的有穷集合,E是两个顶点之间关系的集合,若两顶点之间<v,w>∈E,则<v,w>表示从v到w的一条弧,称v为弧尾或初始点,w为弧头或终端点,此时的图称为有向图,若有<v,w>∈E必有<w,v>∈E,即VR是对称的,则用(v,w)∈E代替,表示v和w之间的一条边,这样的图称为无向图。图的表示方法为G=(V,E)。

弧或边带权的图称为有向网或无向网,权指图的弧或边上相关的数。

若有两个图G1,G2,G1中的顶点和边都是G2中顶点和边的子集,那么G1就是G2的子图

若用n表示结点数目,e表示边或弧的条数,无向图的e最多取到(n-1)*n/2,有向图的e最多取到(n-1)*n,当e取到最大值时,无向图称完全图,有向图称有向完全图。边或弧很少(e<nlogn)的话称为稀疏图,反之称为稠密图。

假如两个顶点vw之间存在一条边,称vw互为邻接点,边(v,w)与顶点vw相互关联,与一个顶点相关联的边的数目称为顶点的度,以顶点为头的边的数目称入度,以顶点为尾的边的数目称出度。

度(TD)=入度(OD)+出度(ID)    有向图中2*n=所有顶点TD之和

如果无向图中uv之间的存在一条路径,即存在能从u至v的顶点序列(u=vi0,vi1...vim=v),如果是有向图,那么为<......>。路径上边的数目称为路径的长度。如果第一个顶点和最后一个顶点相同,那么称为回路或环。若序列中的顶点不重复出现,称为简单路径,若简单路径的u=v,称为简单回路或简单环。

在图中,如果任意两个顶点都是连通的,那么称为连通图。若无向图为非连通图,图中各个极大连通子图为连通分量。对有向图,若任意两个顶点之间都存在一条双向路径,称其为强连通图,否则,将各个强连通子图称为强连通分量。

假设一个连通图有n个顶点和e个边,其中n个顶点和n-1个边构成一个极小连通子图,称其为生成树,如果在一个生成树上添加一条边,必然生成一个环。对非连通图,由各个连通分量生成树的集合为此非连通图的生成森林。如果一个有向图恰有一个顶点的入度为0,其余顶点的入度为1,则是一棵有向树,由若干棵有向树组成的森林为有向图的生成森林。含有图中全部顶点,但只有足以构成若干棵互不相交的有向树的弧。

若一个图有n个顶点和小于n-1条边,则一定是非连通图,若有大于n-1条边,必然有环,但若等于n-1条边,不一定是生成树。

—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——

图的存储结构一般为:邻接数组,邻接表,邻接多重表,十字链表

邻接数组

//邻接数组
#define INT_MAX INFINITY 
#define MAX_VEXNUM 20
#define VRtype int
#define InfoType int
#define VextexType int

typedef enum { DG, UDG, DN, UDN }GraphKind;//有向表,无相表,有向网,无向网

typedef struct ArcCell {
	VRtype adj;//顶点关系类型,无向图1或0表示是否相邻,有向图表示权值
	InfoType* info;//弧有关信息的指针
}ArcCell, AdjMatrix[MAX_VEXNUM][MAX_VEXNUM];

typedef struct {
	VextexType vexs[MAX_VEXNUM];//数组顶点向量
	AdjMatrix arcs;//邻接矩阵
	int vexnum, arcnum;//顶点数和弧数
	GraphKind kind;//图类型
}MGraph;

对无向图,顶点的度是邻接矩阵中第i行或第i列的元素之和。(元素个数相同)

对有向图,顶点连接的弧指向的顶点元素为1。顶点的出度是第i行的元素之和,入度为第i列的元素之和。

对于网,若边∈集合,则值为权值,否则为无穷

—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——

邻接表

//邻接表
//对每个顶点建立一个单链表,结点表示依附于这个顶点的边,对有向图是以该顶点为尾的弧
//每个结点由邻接点域(与当前顶点连接的点在图中的位置),链域(指向下一条边或弧的结点)
//数据域(储存有关信息)组成
//每个链表设一个表头结点,由链域(指向第一个结点)和数据域(储存有关信息)组成
//表头结点通常以顺序结构的形势存储

#define MAX_VERTEX_NUM 20
#define VertexType int

typedef struct ArcNode {
	int adjvex;
	struct ArcNode* nextNode;
	InfoType* info;
}ArcNode;

typedef struct VNode {
	ArcNode* firstarc;
	VertexType data;
}VNode, AdjList[MAX_VERTEX_NUM];

typedef struct {
	AdjList vertices;
	int kind;
	int vexnum, arcnum;
}ALGraph;

边稀疏的情况下,用邻接表比邻接矩阵更省空间。不便于查询两个顶点之间是否有路径相通。

 无向图的邻接表

A:与BE相连接,BE标号为2、5,因此链表中存2、5......

有向图的邻接表, 每个链表结点存储的值是该顶点为弧尾的弧指向的顶点位置

对有向图的邻接表&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值