簡體   English   中英

為圖表編寫DFS迭代器

[英]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.

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