让我首先说明我只想要方向,而不一定是实际代码,除非一个小片段是获得重点的唯一方法。
我需要在C ++中使用邻接列表或矩阵创建DIRECTED图形数据结构,并从标准输入添加顶点/边缘,这意味着动态。
我认为如果能够首先实例化一组顶点,然后创建边并将它们添加到图中,我能够创建一个图形,但我不明白它是怎么回事可以添加一个包含尚未实例化的顶点的边。
例如,标准输入的第一行是:迈阿密 - >纽约/ 1100 - >华盛顿/ 1000 - >阿尔伯克基/ 1700
如果纽约顶点尚未添加到图表中,我该如何添加从迈阿密到纽约的边缘呢?
感谢大家的指导!
答案 0 :(得分:0)
如何添加边缘 包含尚未实例化的顶点。
简单:实例化它..
我认为没有任何问题。假设V
是到目前为止看到的顶点集。 V
最初为空。当您阅读输入x->y
时,您会得到其结束点(x
和y
)。如果未实例化其中任何一个(即,不在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;
};