一、图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中G表示一个图,V是图G中的顶点(Vertex,树中称作结点)的集合,E是图G中边的集合。
图的边分为无向边和有向边,对于有向边(也称作弧Arc),用有序偶
与图的边或弧相关的数叫做权(Weight),带权的图通常称为网(Network)。
对于无向图,顶点V的度(Degree)是和V相关联的边的数目,记为TD(V)。
对于有向图,以顶点V为头的弧的数目称为V的入度(InDegree),记为ID(V);以V为尾的弧的数目称为V的出度(OutDegree),记为OD(V);顶点V的度为TD(V)=ID(V)+OD(V)。
无向图G中从顶点V到顶点V‘的路径(Path)是一个顶点序列。路径的长度是路径上的边或弧的数目。
第一个顶点到最后一个顶点相同的路径称为回路或环(Cycle)。序列中顶点不重复出现的路径称为简单路径。除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环。
在无向图G中,如果从顶点V到顶点V'有路径,则称V和V'是连通的。如果对于图中任意两个顶点Vi、Vj都是连通的,则称G是连通图(Connected Graph)。无向图中的极大连通子图称为连通分量。
在有向图G中,如果对于每一对Vi != Vj,从Vi到Vj和从Vj到Vi都存在路径,则称G是强连通图。有向图中的极大强连通子图称做有向图的强连通分量。
一个连通图的生成树是一个极小的连通子图,它含有图中全部的n个顶点,但足以构成一棵树的n-1条边。
如果一个有向图恰有一个顶点的入度为0,其余顶点的入度均为1,则是一棵有向树。
二、图的存储结构
邻接矩阵(Adjacency Matrix):用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
邻接表(Adjacency List):数组与链表相结合的存储方法称为邻接表,解决邻接矩阵浪费存储空间的问题。
十字链表(Orthogonal List):结合邻接表与逆邻接表。
邻接多重表:方便无向图的边操作。
边集数组:两个一维数组构成。一个存储顶点信息;一个存储边的信息,这个边数组每个数据元素由一条边的起点下标、终点下标和权组成。
三、图的遍历
从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历(Traversing Graph)。
1. 深度优先遍历(Depth First Search,DFS)
2. 广度优先遍历(Breadth First Search,BFS)