图的基本概念(二)

图的存储结构主要有两种:邻接矩阵和邻接表。

什么是邻接矩阵?

如果一个有向图含有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; //含有指向下一个顶点的指针
};

 

posted @ 2018-01-05 15:12  jeavenwong  阅读(334)  评论(0编辑  收藏  举报