我正在尝试实现一个简单的邻接列表。据我所知,数组的索引是该点顶点的关键。
例如: 如果我有格式的边缘:(开始,完成,成本) (1,2,4) (2,3,5) (1,3,27) (3,4,8)
我会有一个
的数组一个问题是持有边缘的容器有指针,但插入其中的元素(边缘)却没有。我输了。
编辑这篇文章,因为我不知道如何在评论中加入代码。
struct Node{
Edge *head;
Node *next;
}
Node *root;
void adjacencyList::insert(const Edge &edge)
{
if(root == NULL)
{
root = new Node;
root->head = edge;
}
else
{
while(root != NULL)
{
root = root->next;
if(root == NULL);
{
root = new Node;
root->head = edge;
root = root ->next;
}
}
}
}
edge对象有3个属性(source,destination,cost) 现在,这只会在链表中添加边缘。我如何通过源分隔列表?
答案 0 :(得分:1)
邻接列表不必是链表。即使它是,不自己实现(侵入性)链表,使用现有的实现。
但我们走了;只有一个(节点,成本)对的向量:
typedef std::pair<int, int> weighted_node_t;
typedef std::vector<std::vector<weighted_node_t>> graph_t;
然后,您可以按如下方式表示图形(使用C ++ 11初始化语法):
graph_t graph{
{},
{{2, 4}, {3, 27}},
{{3, 5}},
{{4, 8}}
};
现在让我们假设您想要遍历图形(深度优先搜索),您将执行以下操作(再次,C ++ 11语法,因为它更干净):
void dfs(graph_t const& graph, std::vector<bool>& visited, int node) {
visited[node] = true;
for (auto const& neighbor : graph[node])
if (not visited[neighbor])
dfs(graph, visited, neighbor.first);
}
并称之为:
std::vector<bool> visited(graph.size());
dfs(graph, visited, 1);