删除存储为邻接列表的图表中的边缘

Deleting edges in a graph stored as adjacency list

本文关键字:边缘 列表 存储 删除      更新时间:2023-10-16

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

我最初的想法是使用

之类的东西

vector<list<pair<Vertex, List<Vertex>::iterator>>> Graph

因此,当我在一个方向上删除边缘时,我将有一种快速的方法,可以使用迭代器将其沿Oposite方向删除,以将其存储在反向方向上。但是,有几个消息来源声称这些迭代器将不再有效,因为当我开始删除项目时,指针结构将会变得不同,并且这些迭代器将不再指向正确的元素。

我的问题是,是否有一种方法可以使用邻接列表在O(1(时间中删除边缘,或者有办法以某种方式标记边缘Oposite方向的边缘遍历。预先感谢。

我需要一个快速的方式(线性时间(才能从图形上删除边缘。

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

方法1 - 保证O(Loge(复杂性

只使用std::set代替std::list

std::vector<std::set<int>> Graph;

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

// adj is your graph,
// v is current vertex
for (auto &w : adj[v]) {
  // process edge [v, w]
}

但是您可以删除O(Loge(中的相对边缘:

// remove [v,w] and [w,v]
adj[v].erase(w);
adj[w].erase(v);

方法2 - 平均o(1(,最坏情况o(e(

std :: unordered_set是可能的恒定时间复杂性,但平均而言:

std::vector<std::unordered_set<int>> Graph;

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