6-图的性质总结
简单图、多重图、子图
满足如下条件的就是简单图:
- 不存在重复边
- 不存在顶点到自己的表(自环)
多重图:
- 若图中某两个顶点的边数大于1
- 允许顶点通过一条边和自身关联
数据结构里面只讨论简单图 子图:
- 其中
- 如果顶点集相同,则是生成子图
简单路径、简单回路
- 一个路径序列中不存在重复节点的是简单路径
- 除第一个顶点和最后一个顶点外,其余节点不重复出现的是简单回路
无向图
这些术语跟有向图区分开来
连通 | 连通图 | 连通分量 | 完全图 | 度 |
---|---|---|---|---|
两个顶点可达 | 图任意两点连通 | 极大连通子图就是连通分量,要求包含所有边 | 边数为:n(n-1)/2 | 度数之和等于边的两倍:Sumn = 2e |
有向图
强连通图 | 强连通分量 | 完全图 | 度 |
---|---|---|---|
v到w和w到v都有路径 | 极大强连通子图就是强连通分量 | 边数为:n(n-1) | 出度=入度=e |
两种存储结构:矩阵和链表
邻接矩阵
邻接矩阵是采用二维数组的存储方式来存储图,为v行v列的矩阵,其中若。 值可以是权值,有向图和无向图有着一定的区别(无向图对称,可以压缩的),能理解其表达的意思就OK。 随便写个矩阵: 其中当图是无向图的时候,矩阵是对称的。有向图则不一定,有向图中,行代表顶点的出,列代表顶点的入,比如上述矩阵,顶点有指向的两条边,而又有的一条边。
typedef struct{
char vex[N];
int weight[N][N]; //N*N邻接矩阵,每条边的权值用int变量表示
int vexnum,arcnum; //图的当前顶点数和弧数
}MGraph;
空间复杂度:显而易见空间复杂度跟顶点个数有关,为 对于的元素表示的是由顶点i到j长度为n的路径有多少条。该结论了解即可 邻接矩阵适用于存储相对稠密的图。
邻接表
看下图理解:
设计顶点表结点和边表结点来存储。顶点表节点由顶点域和指向第一条邻接边的指针构成,包含(顶点域data,边表头指针first)。边表结点中包含指向下一跳邻接边的指针。
typedef struct ArcNode{ //边表
int vexIndex;
int weight;
struct ArcNode *next; //指向下一个边表结点
}ArcNode;
typedef struct VNode{ //顶点表
char data;
ArcNode *first; //指向第一条依附该顶点的弧的指针
}VNode;
typedef struct{
VNode vex[N];
int vexnum,arcnum; //图的顶点数和边数
} ALGraph; //ALGraph是以邻接表存储的图类型
空间复杂度:空间复杂度跟顶点个数和边数有关,若为有向图则