簡體   English   中英

BGL 無向圖出邊迭代器源/目標

[英]BGL Undirected Graph Out-Edge Iterator Source/Target

我有以下無向BGL 圖描述:

typedef boost::adjacency_list<boost::setS, boost::listS, boost::undirectedS, VProp, EProp> Graph;

在我的代碼中,我使用以下循環來訪問給定節點v的外邊緣:

  OutEdgeIter out_i;
  OutEdgeIter out_end;

  for (boost::tie(out_i, out_end) = out_edges(v, g);  out_i != out_end; ++out_i)
  {
    Edge curEdge = *out_i;
    Vertex curNeighbor = boost::target(curEdge, g);

    // Other stuff here.
  }

我注意到以這種方式獲得的任何節點v都有一個特殊的屬性:該節點的target將始終是v的鄰居,而source將始終是v本身。 這在有向圖的情況下當然是有意義的,但我的圖是無向的,如前所述。 目前尚不清楚(僅從定義的角度來看)無向邊的目標來源是什么。

上述是否是 BGL 的書面保證財產? 我已經編寫了一些依賴於這個屬性的單元測試並且它們都通過了,但是我在 BGL 文檔中找不到這個讓我很煩惱(或者我可能只是很不擅長閱讀它們)。

(順便說一句,在設置邊緣屬性時,邊緣的“方向”似乎並不重要。將(u, v)的權重設置為 5 會導致boost::edge(v, u, g)的權重也返回五個:似乎仍然只有一個底層邊緣 object。)

以上是 BGL 的書面保證財產嗎

是的。 我不太確定它會被記錄在案,但我已經看到代碼將 arguments 的順序交換為 add_edge 的順序。

請注意,這在概念上是有道理的:如果您記得鄰接列表是……鄰接列表,並且它們是按源頂點存儲的,那么當從頂點 v 迭代鄰接時,您將得到一個列表,這很有意義相鄰頂點(目標)的集合,並且在迭代 out_edges 時,總是將邊緣合成為每個相鄰目標的(源,目標)是有意義的。

是我所知道的最相關的文檔

BGL 提供的用於訪問和操作無向圖的接口與以下部分中描述的有向圖接口相同,但是在行為和語義上存在一些差異。 例如,在有向圖中,我們可以討論頂點的出邊和入邊。 在無向圖中,沒有in'' and出”,只有與頂點相關的邊。 盡管如此,在 BGL 中,我們仍然使用 out_edges() function(或 in_edges())來訪問無向圖中的事件邊。 類似地,無向邊沒有source'' and目標'',只有一對無序的頂點,但在 BGL 中我們仍然使用 source() 和 target() 來訪問這些頂點。 BGL 沒有為無向圖提供單獨的接口的原因是有向圖上的許多算法也適用於無向圖,並且僅僅因為接口的差異而不得不復制算法會很不方便。 使用無向圖時,只需在心里忽略 function 名稱中的方向性。 下面的示例演示了將 out_edges()、source() 和 target() 與無向圖一起使用。 此示例和以下示例的源代碼可以在 example/undirected_adjacency_list.cpp 中找到。

暫無
暫無

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

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