邻接列表图表示的实现

时间:2013-01-03 04:35:55

标签: c++ data-structures graph-theory

我刚开始使用图论。我无法弄清楚如何使用链表编码邻接列表。例如,如果我有这个图(无向):

A--------B
|       /|\
|      / | \  
|     /  |  \
|    /   |   \
|   /    |    \
|  /     |     \
| /      |      \
C        E-------D

我该如何编码?我知道如何使用邻接矩阵,但如何使用邻接列表和链接列表(c ++)对其进行编码?

3 个答案:

答案 0 :(得分:14)

邻接列表只是列表的向量/数组。图中的每个元素都是数组中的元素,任何边都被添加到它的邻接列表中。因此它看起来像:

A - > {B,C}

B - > {A,C,D,E}

C - > {A,B}

D - > {B,E}

E - > {B,D}

所以我们从std::vector<std::list<vertex>>开始。但是,我们可以做得更好,因为verticies是唯一的,因此我们可以使用map。此外,顶点只能出现在边列表中一次,因此我们将其修改为std::map<vertex, std::set<vertex>>

首先,例如:

struct vertex
{
   //
};

class undirected_graph
{
private:
    std::map<vertex, std::set<vertex>> graph_container;
public:
    void add_vertex(const vertex& v) { //add a vertex to the map }
    void add_edge(const vertex& v, const vertex& u) { //look up vertex in map and add to the vertex adjacency list }
    //Other methods
    //...
 };

答案 1 :(得分:3)

邻接列表只是一组表示图形边缘的对象。

struct edge {
    node *nodes[2];

    edge( node *a, node *b ) {
        if ( a < b ) { // define canonical order of edges for undirected graph
            nodes[0] = a;
            nodes[1] = b;
        } else {
            nodes[0] = b;
            nodes[1] = a;
        }
    }
};

链表听起来不太实际;通常你会定义边的排序并将它们放在std::setstd::map

bool operator< ( edge const &lhs, edge const &rhs ) {
    if ( lhs.nodes[0] < rhs.nodes[0] ) return true;
    if ( rhs.nodes[0] < lhs.nodes[0] ) return false;
    return lhs.nodes[1] < rhs.nodes[1];
}

typedef std::set< edge > graph;

有很多方法可以做到这一点,如果不知道你打算用图表做什么,很难再提出更多建议。

答案 2 :(得分:0)

您可以从以下 repo ( CXXGraph ) 的源代码中获取灵感。

这个 repo 包含一个只有头的库和一个邻接矩阵的实现。