目录
图是一种多对多的结构
在图中的数据元素通常被称作顶点。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......
有向图的邻接表, 每个链表结点存储的值是该顶点为弧尾的弧指向的顶点位置
对有向图的邻接表&#