Мне нужен быстрый способ (линейное время), чтобы удалить ребро из графа.
Возможно, но вам нужно изменить представление графа из-за проблем, которые вы описали.
Подход 1 - гарантированная сложность O (logE)
Просто используйте std::set
вместо std::list
:
std::vector<std::set<int>> Graph;
Это позволяет проходить и обрабатывать все смежные узлы одинаково:
// 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. 1. 1035 *