删除存储为邻接列表的图表中的边缘
Deleting edges in a graph stored as adjacency list
我正在尝试实现一种算法,以在存储为邻接列表的无向图中查找欧拉路径。我需要一个快速的方式(线性时间(才能从图表中删除边缘。
我最初的想法是使用
之类的东西 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。
相关文章:
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 使用简单类型列表实现的指数编译时间.为什么
- 一对向量构造函数:初始值设定项列表与显式构造
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 通过for循环使用用户输入填充列表
- C++:如何使函数只返回作为列表一部分的字符串
- 概念中的cv限定符需要表达式参数列表
- 删除存储为邻接列表的图表中的边缘
- 如何将边缘列表转换为DCEL数据结构
- 类边缘列表C
- 如何从图形的邻接列表表示中随机选择边缘
- BGL:邻接列表为描述符返回错误的边缘属性