Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除存储为邻接列表的图形中的边_C++_Graph_Adjacency List - Fatal编程技术网

C++ 删除存储为邻接列表的图形中的边

C++ 删除存储为邻接列表的图形中的边,c++,graph,adjacency-list,C++,Graph,Adjacency List,我正在尝试实现一种算法,用于在存储为邻接列表的无向图中查找欧拉路径。我需要一个快速的线性时间从图形中删除边 我最初的想法是使用 矢量图 因此,当我在一个方向上删除边时,我将有一种快速的方法,使用迭代器在反方向上将其删除到存储位置。然而,有几个来源声称,这些迭代器将不再有效,因为当我开始删除项时,指针结构将变得不同,这些迭代器将不再指向正确的元素 我的问题是,有没有一种方法可以使用邻接列表在O1时间内删除一条边,或者有没有一种方法可以以某种方式标记该边,因此,当我位于相邻顶点时,我将确定该边在op

我正在尝试实现一种算法,用于在存储为邻接列表的无向图中查找欧拉路径。我需要一个快速的线性时间从图形中删除边

我最初的想法是使用

矢量图

因此,当我在一个方向上删除边时,我将有一种快速的方法,使用迭代器在反方向上将其删除到存储位置。然而,有几个来源声称,这些迭代器将不再有效,因为当我开始删除项时,指针结构将变得不同,这些迭代器将不再指向正确的元素

我的问题是,有没有一种方法可以使用邻接列表在O1时间内删除一条边,或者有没有一种方法可以以某种方式标记该边,因此,当我位于相邻顶点时,我将确定该边在oposite方向上是经过的。提前谢谢

我需要一个快速的线性时间从图形中删除边

这是可能的,但由于您描述的问题,您必须更改图形表示

方法1-保证OlogE复杂性

只需使用std::set而不是std::list:

向量图

这允许以相同的方式遍历和处理所有相邻节点:

// adj is your graph,
// v is current vertex
for (auto &w : adj[v]) {
  // process edge [v, w]
}
但您可以在OlogE中使用相反的边:

// remove [v,w] and [w,v]
adj[v].erase(w);
adj[w].erase(v);
方法2-平均O1,最坏情况OE

std::unordered_集合可能具有恒定的时间复杂度,但仅在平均情况下:

向量图


遍历和擦除模式保持不变,但我个人更喜欢方法1。

如果没有能够满足您需求的算法怎么办?另外,你提到了一种方法,你试过吗?@UlrichEckhardt我研究的算法声称在O | E |时间内有效,但没有说明如何有效地删除边缘。我是C++新手,不知道如何实现列表数据结构。如果它是双链接的,我觉得我的方法应该有效,因为节点可以在被删除之前更新相邻节点的指针,但有几篇文章声称它没有,所以我可能遗漏了什么?