动态添加到图形数据结构

时间:2014-11-12 09:17:22

标签: c++ dynamic data-structures vertex directed-graph

让我首先说明我只想要方向,而不一定是实际代码,除非一个小片段是获得重点的唯一方法。

我需要在C ++中使用邻接列表或矩阵创建DIRECTED图形数据结构,并从标准输入添加顶点/边缘,这意味着动态。

我认为如果能够首先实例化一组顶点,然后创建边并将它们添加到图中,我能够创建一个图形,但我不明白它是怎么回事可以添加一个包含尚未实例化的顶点的边。

例如,标准输入的第一行是:

迈阿密 - >纽约/ 1100 - >华盛顿/ 1000 - >阿尔伯克基/ 1700

如果纽约顶点尚未添加到图表中,我该如何添加从迈阿密到纽约的边缘呢?

感谢大家的指导!

2 个答案:

答案 0 :(得分:0)

  

如何添加边缘   包含尚未实例化的顶点。

简单:实例化它..

我认为没有任何问题。假设V是到目前为止看到的顶点集。 V最初为空。当您阅读输入x->y时,您会得到其结束点(xy)。如果未实例化其中任何一个(即,不在V中),则将其实例化并将其添加到顶点集。

另一种观察方式:假设我们通过边集E定义图形。根据定义,任何边都是一对顶点,这些顶点又定义了图的顶点集。

答案 1 :(得分:0)

每次有一个新的唯一节点时,如何调整邻接列表的大小?您可以维护一组唯一的节点值,并在每次添加节点时使用其大小来调整邻接列表的大小。下面是一些相同的代码。

class Graph
{
    public:
    // Add links in the graph
    void addLink(int id1, int id2){
        // Add to hashset
        uniqueNodes.insert(id1);
        uniqueNodes.insert(id2);
        // Resize on the adjacency list based on how many nodes exists in the uniqueNodes set
        adjList.resize(uniqueNodes.size());
        // Make the connections assuming undirected graph
        adjList[id1].push_back(id2);
        adjList[id2].push_back(id1);
    }

    // Print the graph
    void printGraph(){
        for(int i = 0; i < adjList.size(); i++){
            cout << i << ":";
            for(auto it = adjList[i].begin(); it != adjList[i].end(); it++)
                cout << *it << "->";
            cout << "NULL\n";
        }
    }

    private:
    // Adjacency list for the graph
    vector<list<int>> adjList;
    // Hashset to help define the size of the adjacency list as nodes come in
    set<int> uniqueNodes;
};