图G由顶点集V和边集E组成,记为G=(V,E)
图不可为空,一定有顶点集不为空
有向图:有向边(弧)的有限集合
无向图:无向边的有限集合
连通:顶点V到顶点V'有路径
连通分量:无向图中的极大连通子图(极大:1.顶点足够多;2.极大连通子图包含依附这些点的所有边)
强连通分量:有向图中的极大强连通子图
连通的生成树:包含图中的全部n个顶点,但只有n-1条边的极小连通子图
度:以该顶点为一个端点的边数目
入度(ID):以顶点为终点的有向边数目
出度(OD):以顶点为起点的有向边数目
图的存储结构
邻接矩阵(顺序存储)
顶点:用一维数组存储 边/弧:用二维数组存储
#define MaxVertexNum 100 //顶点数目最大值 typedef char VertexType; //顶点的数据类型项,不同情况不一样 typedef int EdgeType; //整数表示权值或者连通性 typedef struct{ VertexType Vex[MaxVertexNum]; //顶点表 EdgeType [MaxVertexNum][MaxVertexNum]; //邻接矩阵 int vexnum,arcnum; //图的当前顶点数和弧数 }MGraph
邻接表:存储的无向图中查找顶点容易,但是修改边或者查询边需要遍历链表。
图的遍历
从图中某一顶点出发,访遍图中其余顶点,且使每一个顶点仅被访问一次。
BFS(广度优先遍历):类似于树的层序遍历算法
时间复杂度:
邻接表:每个顶点入队一次,O(|V|),对于每个顶点,搜索其邻接点,所以访问该顶点所有边,O(|E|),所以总时间复杂度O(|V|+|E|)。
邻接矩阵:每个顶点入队一次,O(|V|),对于每个顶点,搜索其邻接点,所以遍历矩阵,O(|V|),所以总时间复杂度O(|V|2|)。
DFS(深度优先遍历):类似于树的先序遍历算法。
邻接表:每个顶点入队一次,O(|V|),对于每个顶点,搜索其邻接点,所以访问该顶点所有边,O(|E|),所以总时间复杂度O(|V|+|E|)。
邻接矩阵:每个顶点入队一次,O(|V|),对于每个顶点,搜索其邻接点,所以遍历矩阵,O(|V|),所以总时间复杂度O(|V|2|)。
总结