图的基本概念(二)
图的存储结构主要有两种:邻接矩阵和邻接表。
什么是邻接矩阵?
如果一个有向图含有n个顶点,则可以用n×n的布尔型矩阵adjacency[n][n]来存储图状结构。
若顶点v邻接到顶点w,则adjacency[v][w]= true,否则adjacency[v][w]= false
上述图状结构的表示方法称为邻接矩阵表示法。
对于无向图而言,采用邻接矩阵表示法,则邻接矩阵必为对称矩阵,即adjacency[v][w]= adjacency[w][v]。
下面是邻接矩阵实现的图状结构:
template <int max_size> class Gragh { int count; //用来记录顶点数目 bool adjacency[max_size][max_size]; //邻接矩阵,用来存放顶点和边的信息 };
什么是邻接表?
除采用邻接矩阵表示图状结构外,还可以采用邻接表的方法实现图状结构。
在邻接表表示法中,n个顶点的图状结构可以表示成一个含有n个元素的线性表(称为顶点表)和n个线性表(称为邻接表)。
每个顶点对应一个邻接表,顶点v对应的邻接表记录了顶点v邻接到的所有顶点。
顶点表和邻接表既可以采用链式线性表也可以采用顺序线性表。
下面的图片是邻接表实现的图状结构示意图:
注意:顶点表和邻接表都可以是链式存储(链表)也可以是顺序存储(数组)。
下面左图中顶点表示数组,邻接表是链表。(左图的结构和hash表的结构相像)右图中顶点表是链表,邻接表也是链表。当顶点表和链接表均为链表的这种实现称为十字链表法。
上面左图的实现:
typedef int vertex; template <int max_size> class Graph { int count; //顶点数 list<vertex> neighbors[max_size]; //顶点表是数组,邻接表是链表,用c++内置的List };
其中list是c++的常用容器之一,可参考:http://blog.csdn.net/yas12345678/article/details/52601578
上面右图的实现(十字链表法):
class edge; class vertex; class Graph { vertex* first_vertex; //图中只有一个指向第一个顶点的指针 }; class edge { vertex* end_point; //每条边中有指向邻接到的结点的指针 edge* next_edge; //边中有指向邻接到顶点的下一条边的指针 }; class vertex { edge* first_edge; //每个点中有指向第一条边的指针 vertex* next_vertex; //含有指向下一个顶点的指针 };
少一些功利主义的追求,多一些不为什么的坚持!