简介
图是由顶点和边组成的一种数据结构。n表示顶点数,e表示边的个数。
a,图按照边有没有方向可分为有向图和无向图两种
b,完全图:每对不同的顶点之间都恰连有一条边相连。n个顶点的有向完全图的边的个数为nx(n-1),无向完全图的边的个数为(nx(n-1))/2。图按照边的数目多少可以分为稀疏图和稠密图
c,顶点的度:图中某个顶点的度为该顶点所连接的边的个数。有向图中顶点的度按照指向该结点和由该结点出发可分为出度和入度。 有:图中所有顶点的度数之和=2e
d,基本路径:该路径中没有重复的顶点。简单路径:该路径中没有重复的边。
简单回路:由简单路径构成的回路
e,无向图按照任意顶点是否存在路径分为连通图和非连通图两种,类似的,有向图分为强连通图和非强连通图。无向图:在非连通图中极大连通子图称为连通分量,有向图:在非强连通图中的极大强连通子图称为强连通分量。
f,生成树:一个连通图的生成树就是它的一个极小连通子图。就是在满足连通图的前提下,去掉其中多余的边,生成树含有图的所有n个顶点,但只含有构成一棵树的n-1条边(可以回忆下树的性质:结点数=分支数+1)
图的存储结构
这里只介绍两种:邻接矩阵和邻接表
邻接矩阵
邻接矩阵是一个nxn的二维数组,数组中标记了任意两个顶点之间的连接情况,无向图中该边存在就标记为1,有向图该边存在就标记为对应权值;没有边存在标记为0;顶点自身的连接可标记为0或无穷大(一般选择也标记为0)。如下:
typedef struct
{
int vexnum, arcnum;//顶点数和边数
char vex[maxSize];//顶点信息(字符)
int arc[maxSize][maxSize];//二维数组(存储边上的信息)
}mGraph;
无向图的邻接矩阵是个对称矩阵,且任一顶点的度是它所对应的行(列)中非零元素的个数。有向图的是非对称矩阵,顶点的出度为该顶点所对应行中非零元素个数,入度为对应列中非零元素的个数。
邻接矩阵适合进行稠密图的存储。
邻接表
是一种顺序分配和链式分配相结合的存储结构。将顶点存放在顺序表vertices中,每个顶点所连接的边(出度)通过链表来存放,即边表结点arcNode。如下:
typedef struct arcNode
{
int adjvex;//与该边所连顶点的序号
double weight;//边上的权值
struct arcNode* nextArc;
}arcNode;//边表结点
typedef struct
{
char data;顶点中存储的数据
arcNode* firstArc;
}adjList;//顶点
typedef struct{
int vexnum, arcnum;
adjList vertices[maxSize];
}aGraph;
邻接表适合存储稀疏图