图的遍历
图由顶点(Vertex)和边(Edge)组成,每条边的两端都必须是图的两个顶点,记号G(V,E)表示图G的顶点集为V,边集为E。
图可以分为有向图和无向图,有向图的所有边都有方向,即确定了顶点到顶点的一个指向;无向图的所有边都是双向的,即无向边所连接的两个顶点可以互相到达。
顶点的度是指和该顶点相连的边的条数,对有向图来说,顶点的出边条数称为该顶点的出度,顶点的入边条数称为该顶点的入度。
顶点和边都可以有一定属性,而量化的属性称为权值,顶点的权值和边的权值分别称为点权和边权。
图的存储方式常用的有两种:邻接矩阵和邻接表。
1.邻接矩阵
设图G(V,E)的顶点标号为0,1,…N-1,那么可以令二维数组G[N]
[N]的两维分别表示图的顶点标号,即如果G[i][i]为1,则说明顶点i和顶点j之间有边;如果G[i][j]为0,则说明顶点i和顶点j之间不存在边,而这个二维数组G[][]则被称为邻接矩阵。如果存在边权,则可以令G[i][j]存放边权,对不存在的边可以设边权为0、-1或者一个很大的数。
2.邻接表
设图G(V,E)的顶点编号为0,1,…N-1,每个顶点都可能有若干条出边,如果把同一个顶点的所有出边放在一个列表中,那么N个顶点就会有N个列表(没有出边,则对应空表)。这N个列表被称为图G的邻接表,记为Adj[N],其中Adj[N]存放顶点i的所有出边组成的列表,这样Adj[0],Adj[1],…,Adj[N-1]就分别都是一个列表。由于列表可以用链表实现。可以使用vector来实现链表,vector有变长数组之称,因此可以开一个vector数组Adj[N],其中N为顶点个数,这样每个Adj[i]就都是一个变长数组vector,使得存储空间只与图的边数有关。