簡體   English   中英

圖的O(m + n)-時間算法

[英]O(m+n)-time algorithm for a graph

我剛剛開始學習圖,似乎無法針對這個問題提出算法,甚至都不知道從哪里開始。 我將衷心感謝您的幫助!

對於給定的連通圖G =(V,E),設計O(n + m)時間算法以找到節點v∈V,因此刪除v及其所有相鄰邊不會斷開G的連接。

先感謝您!

執行圖形的廣度優先搜索。 找到的最后一個節點可以刪除而無需斷開圖形。

證明:BFS生成圖的生成樹,並且找到的最后一個節點始終是該樹的葉子。 刪除生成樹的葉子不會斷開樹的連接,而會留下其余頂點的生成樹。

在以下情況下,可以刪除頂點(無需斷開其余圖的連接):

  1. 這不是一個銜接點; 要么
  2. 它終止圖中的一條路徑,該路徑僅在一端連接。 要么
  3. 它是圖中唯一的頂點。

參見J.Hopcroft。 Tarjan,R.(1973年)。 “算法447:圖形操作的有效算法”。 ACM的通信。 16(6):372-378,用於識別鉸接點的算法:

在圖上執行深度優先搜索-以下是遞歸DFS算法的一些偽代碼:

procedure RecursiveDFS ( u ) {
  mark u as visited
  u.index = u.lowPoint = ++global_index
  if (   ( u is the root and has zero connected edges )
      or ( u is not the root and has one connected edge ) ) {
    mark u as a leaf
  }
  for each ( edge e connected to u ) {
    if ( e is unvisited ) {
      mark e as visited
      let e = {u , v}
      if ( v is unvisited ) {
        mark e as tree edge
        RecursiveDFS ( v )
        if ( v.lowPoint < u.lowPoint )
        {
          u.lowPoint = v.index
        } else {
          mark u as an articulation-point
        }
      } else {
        mark e as cotree edge
        if ( v.index < u.lowPoint )
        {
          u.lowPoint = v.index
        }
      }
    }
  }
}

這將訪問每個頂點和每個邊緣一次O(m+n)並且如果在給定的頂點處存在以該頂點為根的DFS子樹而沒有協樹(后)邊,則將頂點標記為關節點從與該給定頂點的祖先連接的子樹發出。

特殊情況是根頂點(在其中啟動了DFS),該根頂點將始終被標記為一個關節點(因為它沒有子樹可以連接到的祖先)-相反,您應該檢查根頂點是否只有一個相鄰樹邊緣和一個或多個相鄰的同樹(后)邊緣(並且是雙向連接的組件的一部分)。

終止路徑的頂點將是:

  1. DFS樹的葉頂點(在DFS樹中,父樹的邊緣恰好有一個連接的樹邊緣,而輔樹的邊緣則為零); 要么
  2. DFS樹的根頂點是一個相鄰的樹邊緣和零個相鄰的同樹(后)邊緣。

暫無
暫無

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

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