图:graph
图的基本概念:
顶点vertex,n个顶点
无向图 :Undigraph,边edge,边的数目取值:e = 0--(n*(n-1))/2
e = (n*(n-1))/2 无向完全图
有向图:Digraph,弧头head(终端点),弧尾tail(起始点)
弧的数目取值:e = 0--(n*(n-1)
e = n*(n-1) 有向完全图
与图的弧或边相关的数值叫权。
顶点的度等于其出度 + 入度。
回路和环:第一个顶点与最后一个顶点相同的路径
简单路径:序列中顶点不重复的路径
简单回路 简单环:回路中除了第一个顶点和最后一个顶点相同外,其他顶点不重复出现
连通图: 无向图中的概念
在无向图中,如果两个顶点间存在路径,即认为他们是连通的。
如果在无向图中,任何两个顶点之间都存在路径的话,此图为连通图connected graph
连通分量:无向图中的极大连通子图
强连通图: 有向图中的概念
在有向图中,如果两个顶点间存在路径,即认为它们是强连通的。
如果任意两个顶点间存在路径的话,此图为强连通图
强连通分量:有向图中的极大强连通子图
一个连通图的生成树是一个极小连通子图。n个顶点的生成树有且仅有n-1条边。
有向树:如果一个有向图,恰有一个顶点入度为0,其他顶点入度均为1
一个有向图的生成森林由若干有向树组成。
图的存储结构:
1.数组表示法 邻接矩阵
用两个数组分别存储顶点的信息和边或弧的信息
#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20
typedef emun{DG,DN,AG,AN}GraphKind;
//顶点定义
typedef struct ArchCell{
VRTType adj; //顶点关系类型
InfoType *info; //
}ArcCell,AdjMarix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
//图的定义
typedef struct{
VertexType vexs[MAX_VERTEX_NUM]; //顶点信息
AdjMatrix arcs; //边或弧信息
int vexnum,arcnum;
GraphKind kind;
}MGraph;
2.邻接表 Adjecency List 适用于无向图,如果是有向图的话,需要邻接表和逆邻接表的结合
为途中每一个顶点建立一个单链表,每个链表有头结点,只是当前顶点。表中结点指示边和弧;
头结点:
data
firstarc
表结点(弧结点):
adjvex
nextarc
info
#define MAX_VERTEX_NUM 20
typedef struct ArcNode{
int adjvex;
struct ArcNode *NextArc;
InfoType info;
}ArcNode;
typedef struct VNode{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
int kind;
}ALGraph;
逆邻接表:考虑到有向图中弧的方向,为结点建立以结点为头的弧的逆邻接表。
3.十字链表orthogonal list
可以看成是有向图的邻接表和逆邻接表结合起来的链表。
顶点结点:
data
firstin
firstout
弧结点:
tailvex
headvex
hlink
tlink
info
弧尾顶点 弧头结点 弧头相同的下一弧 弧尾相同的下一弧
数据结构:
typedef struct AcrBox{
int tailvex , headvex;
struct AcrBox *hlink, *tlink;
InfoType *info;
}ArcBox;
typedef struct VexNode{
VertexType data;
VerBox *firstin, *firstout; //指向顶点的第一条入弧和出弧
}VexNode;
typedef struct{
VexNode xlist[MAX_VERTEX_NUM]; //表头向量
int vexnum , arcnum;
}OLGraph;
4.邻接多重表 adjacency multilist
无向图的链式存储方式
边结点:
mark
ivex
ilink
jvex
jlink
info
访问标记位 边的顶点i 依附i的下一边 边的顶点j 依附j的下一边
顶点:
data
firstedge
依附顶点的第一条边
数据结构:
typedef enum {Unvisited, Visited}VistedTag;
typedef struct Edge{
int mark;
int ivex, jvex;
struct Edge *ilink, *jlink;
InfoType *info;
}Edge;
typedef struct VexBox{
VertexType data;
Edge *firstedge;
}VexBox;
typedef struct {
VexBox adjmulist[MAX_VERTEX_NUM]; //表头向量
int vexnum, edgenum;
}AMLGraph;