簡體   English   中英

刪除存儲為鄰接表的圖中的邊

[英]Deleting edges in a graph stored as adjacency list

我正在嘗試實現一種算法,用於在存儲為鄰接列表的無向圖中查找歐拉路徑。 我需要一種快速的方法(線性時間)從圖中刪除一條邊。

我最初的想法是使用類似的東西

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

因此,當我在一個方向上刪除邊緣時,我將有一種快速的方法可以使用迭代器在相反方向將其刪除到相反方向的存儲位置。 然而,一些消息來源聲稱這些迭代器將不再有效,因為當我開始刪除項目時,指針結構將變得不同,並且這些迭代器將不再指向正確的元素。

我的問題是,有沒有辦法使用鄰接列表在 O(1) 時間內實現刪除邊,或者有沒有辦法以某種方式標記邊,所以當我在相鄰頂點時,我會確定穿過了相反的方向。 提前致謝。

我需要一種快速的方法(線性時間)從圖中刪除一條邊。

這是可能的,但是由於您描述的問題,您必須更改圖形表示。

方法 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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM