图
最后更新于
这有帮助吗?
表示“多对多”的关系
包含:
一组顶点:通常用 表示顶点集合
一组边:通常用 表示边的集合
边是顶点对: ,其中
有向边 表示从 指向 的边(单行线)
不考虑重边和自回路
类型名称:图
数据对象集合: 由一个非空的有限顶点集合 和一个有限边集合 组成
操作集:对于任意图 ,以及
Graph Create()
:建立并返回空图;
Graph InsertVertex(Graph G, Vertex v)
:将 插入 ;
Graph InsertEdge(Graph G, Edge e)
:将 插入 ;
void DFS(Graph G, Vertex v)
:从顶点 出发深度优先遍历图 ;
void BFS(Graph G, Vertex v)
:从顶点 出发宽度优先遍历图 ;
void ShortestPath(Graph G, Vertex v, int Dist[])
:计算图 中顶点 到任意其它顶点的最短距离;
void MST(Graph G)
:计算图 的最小生成树;
对于无向图的存储,省一半空间的方法
优点:
直观、简单、好理解
方便检查任意一对顶点间是否存在边
方便找任一顶点的所有“邻接点”(有边直接相连的顶点)
方便计算任一顶点的“度”(从该点出发的边数为“出度”,指向该点的边数为“入度”)
无向图:对应行(或列)非0元素的个数
有向图:对应行非0元素的个数是“出度”;对应列非0元素的个数是“入度”
缺点:
浪费空间
稀疏图(点很多而边很少)有大量无效元素
稠密图(特别是完全图)还是很合算的
浪费时间:统计稀疏图中一共有多少边
一定要足够稀疏才合算
优点:
方便找任一顶点的所有“邻接点”
节约稀疏图的空间
需要 N 个头指针 + 2E 个结点(每个结点至少 2 个域)
方便计算任一顶点的“度”?
对于无向图:是的
对于有向图:只能计算“出度”;需要构造“逆邻接表”(存指向自己的边)来计算“入度”
缺点:
不方便计算任意一对顶点间是否存在边
回路:起点等于终点的路径
连通图:图中任意两顶点均连通
连通分量:无向图的极大连通子图
极大顶点数:再加1个顶点就不连通
极大边数:包含子图中所有顶点相连的所有边
强连通图:有向图中任意两顶点均强连通
强连通分量:有向图的极大强连通子图
邻接矩阵 : 个顶点从 0 到 N-1 编号
邻接表: 为指针数组,对应矩阵每行一个链表,只存非0元素
连通:如果从 到 存在一条 (无向)路径,则称 和 是连通的
路径: 到 的路径是一系列顶点 的集合,其中任一对相邻的顶点间都有图中的边。路径的长度是路径中的边数(如果带权,则是所有边的权重和)。如果 到 之间的所有顶点都不同,则称简单路径
强连通:有向图中顶点 和 之间存在双向路径,则称 和 是强连通的