图表'用c ++实现

时间:2016-08-25 13:33:56

标签: c++

给出邻接关系,如

  

3 - > 4
  1→ 3
  等。

如何构建它的图形。我想要一个初学者可以理解的更简单的实现。我知道自我参照结构。请帮忙

2 个答案:

答案 0 :(得分:4)

为什么不使用 Adjacency Matrix ,这非常简单易行。

邻接矩阵是定义图的顶点之间关系的矩阵。

enter image description here

在上面的示例中,您有一个从顶点12的边,因此在邻接矩阵的索引1处有一个[1][2],类似是[1][3]等等的情况。

而且您从15没有任何优势,因此索引0[1][5],依此类推。

你也可以使用 Adjacency List ,现在继续谷歌以了解如何使用邻接矩阵和邻接列表,然后回过头来解决一些真正的问题。< / p>

修改

我知道,您对如何实施图表一无所知,让我使用邻接矩阵为您编写一些示例。

我假设您知道如何在c ++中分配2D数组。

现在,如果要为包含n个顶点的图形创建邻接矩阵,只需创建一个大小为n x n的2D数组,并使用0初始化其中的所有元素

int** createAdjacencyMatrix(int n){
    int** graph = new int*[n];
    for (int i = 0; i < n; i++){
        graph[i] = new int[n];
        for (int j = 0; j < n; j++){
            graph[i][j] = 0;
        }
    }
    return graph;
}

你去,打电话给这个功能,你自己创建了一个邻接矩阵。

int** graph = createAdjacencyMatrix(5);

现在,您可以对图表执行任何操作(目前,它没有任何边缘)。

要在其中加上边,只需将1放在想放边的位置即可。

void putEdge(int** graph, int startFrom, int endAt, int totalVertices){
    if (startFrom >= 1 && startFrom <= totalVertices && endAt >= 1 && endAt <= totalVertices){
        graph[startFrom - 1][endAt - 1] = 1; // Because c++ uses 0 based indexing, so 1 will be stored at 0, 2 at 1 and so on.
    }
}

现在,只需调用此函数,并在图形中添加一些边。 所以我要设置一些边缘并在其中创建上面显示的图形。

putEdge(graph, 1, 2, 5);
putEdge(graph, 1, 3, 5);
putEdge(graph, 1, 4, 5);
putEdge(graph, 2, 3, 5);
putEdge(graph, 3, 2, 5);
putEdge(graph, 5, 2, 5);
putEdge(graph, 4, 4, 5);

现在,你可以用你的图表做任何你想做的事情,比如我们应该计算出vertex 1有多少外向边?

为此,您可以简单地遍历第1行

int noOfOutgoingEdges(int** graph, int vetex, int totalVertices){
    if (vertex < 1 || vertex > totalVertices)
        return -1;

    int count = 0;
    for (int i = 0; i < totalVertices; i++){
        if (graph[vertex - 1][i] == 1)
            count++;
    }
    return count;
}

最后,您应该为邻接图解除分配的内存。

void deallocateGraph(int** graph, int totalVertices){
    for (int i = 0; i < totalVertices; i++)
        delete[] graph[i];
    delete[] graph;
}

所以,我认为,到目前为止,您已经有了更好的理解。

我只使用函数实现了图形,并将邻接矩阵传递给它们(我的坏),我强烈建议在一个类中实现Graph,它可以处理所有的Graph本身,而你不必将邻接矩阵传递给它,您甚至不必知道Graph类是使用Adjacency Matrix还是其他方法实现的(当然在使用类时,不实现它)

你的课应该是这样的:

class Graph{

   int** adjMatrix;
   int totalVertices;

public:
   Graph(int totalVertices);
   void putEdge(int startFrom, int endAt);
   int noOfOutgoingEdges(int vertex);
   int noOfIncomingEdges(int vertex);
   ~Graph(); 

};

现在,继续实现这个类,并在那里添加你想要的任何函数。

答案 1 :(得分:0)

使用适当的抽象级别。您想将每个节点表示为带有一组neightbours的int吗?

map<int, set<int>> neighbours  {
    { 1, { 2, 3, 4} },
    { 2, { 3 }},
    { 3, { 2 }},
    { 4, { 4 }},
    { 5, { 2 }}
};