[英]writing DFS iterator for graph
我堅持為圖形實現C ++ iterator
,它由鄰接列表表示。 所以,我的想法是我的迭代器應該通過使用DFS算法來完成圖。 例如,對於++迭代器,它會轉到當前頂點的下一個未訪問的頂點(就像在簡單的DFS中一樣)。
我的圖形頂點和迭代器的模板很簡單:
template < typename VType, typename EType >
struct vertex {
typedef vertex < VType, EType > graph_vertex;
vertex (string _name, VType _v_data): name(_name), v_data(_v_data) { }
typedef pair < graph_vertex* , EType > ve;
vector <ve> adj; //adjacency list [ graph_vertex, edge_value ]
string name;
VType v_data;
bool marked; // for DFS
};
template < typename VType, typename EType >
class dfs_iterator {
public:
dfs_iterator();
dfs_iterator( graph_vertex* start );
~dfs_iterator();
dfs_iterator(const dfs_iterator& that);
dfs_iterator& operator = (const dfs_iterator& that) {
val = that.val;
}
dfs_iterator& operator ++ () { } // read down
dfs_iterator& operator -- () { } // read down
VType operator * () { return val->v_data; };
bool operator == (const dfs_iterator& that) const { return val == that.val; }
bool operator != (const dfs_iterator& that) const { return !(*this == that); }
private:
graph_vertex* val;
};
我想的事情:
在struct vertex
應該是:
指針graph_vertex*
到頂點,迭代(++'ed)到
這個(當前)頂點(從當前頂點返回)。 我將它命名為graph_vertex* predecessor_vertex;
successor()和predecessor()函數,它們將指針graph_vertex*
返回到下一個/上一個(用於DF搜索)頂點。
pseudocode successor(CURR_VERT): for every graph_vertex VERT in CURR_VERT->ADJ LIST do { if ( VERT not marked ) return VERT; return successor (predecessor_vertex); } pseudocode predecessor(CURR_VERT): return CURR_VERT->predecessor_vertex;
如果我以正確的方式思考,現在我得到了一個++
和--
對於我的dfs_iterator(++ /的重載函數 - 將返回存儲在迭代器中的當前頂點的successor()/ predecessor()(當然,更改marked
當前頂點的標志)
但我不明白如何處理情況,當用戶為一個圖創建大量迭代器時, graph_vertex
信息將會損壞,因為marked
標志將無法正確響應(一個迭代器可以更改它,然后第二個無法遍歷此頂點)。 我應該在每個迭代器中存儲一個特殊的marked
標志vector
,而不是在頂點中嗎? 或以某種方式將此信息復制到graph_vertex
標志? 我應該為這個迭代器重載一些其他運算符嗎?
請給我一些關於我的代碼和實現的提示。 我是否以正確的方式思考?
//實際上,我找不到任何關於這種圖形迭代器的信息,而且我是C ++的新手。
與算法相關的所有內容都應該在迭代器中,而不是在圖中。 更准確地說,您的迭代器不應該修改圖形的狀態。 想想你在const
圖上使用的迭代器。 沒有什么能阻止您在迭代器中使用很少的數據結構。 例如,一種天真的方法就是取而代之
bool marked; // for DFS
在您的類頂點由迭代器本身中的映射。
std::map<struct vertex*, bool> visited_vertices
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.