簡體   English   中英

C ++有向圖深度優先搜索

[英]c++ directed graph depth first search

我正在嘗試為有向圖編寫方法DFS方法。 現在,我遇到了細分錯誤,我真的不確定它在哪里。 從我對有向圖的理解中,我相信我的邏輯是正確的……但是換個新的眼睛會很有幫助。

這是我的功能:

void wdigraph::depth_first (int v) const {

static int fVertex = -1;
static bool* visited = NULL;

if( fVertex == -1 ) {
   fVertex = v;
   visited = new bool[size];
   for( int x = 0; x < size; x++ ) {
      visited[x] = false;
   }
}

cout << label[v];
visited[v] = true;

for (int v = 0; v < adj_matrix.size(); v++) {
   for( int x = 0; x < adj_matrix.size(); x++) {
     if( adj_matrix[v][x] != 0 && visited[x] != false ) {
        cout << " -> ";
        depth_first(x);
     }
     if ( v == fVertex ) {
        fVertex = -1;
        delete [] visited;
        visited = NULL;
     }
   }
}
}

類定義:

class wdigraph {
public:
wdigraph(int =NO_NODES);          // default constructor
~wdigraph() {};                   // destructor
int get_size() { return size; }   // returns size of digraph

void depth_first(int) const;// traverses graph using depth-first search
void print_graph() const;   // prints adjacency matrix of digraph

private:
int size;                         // size of digraph
vector<char> label;               // node labels
vector< vector<int> > adj_matrix; // adjacency matrix
};

謝謝!

您將在程序結束之前刪除已visited的對象。 回到起始頂點並不意味着您已經完成。 例如,對於V = {1,2,3}的圖,E = {(1,2),(2,1),(1,3)}。

另外,請注意,您將v用作輸入參數,也用作for循環變量。

我看到幾個問題:

下一行

 if( adj_matrix[v][x] != 0 && visited[x] != false ) {

應該更改為

 if( adj_matrix[v][x] != 0 && visited[x] == false ) {

(您想遞歸僅在沒有被訪問過的頂點。)

另外,您正在for循環中創建一個新變量v來隱藏參數v :這是合法的C ++,但這幾乎總是一個糟糕的主意。

您可能需要考慮幾件事。 首先是函數級靜態變量通常不是一個好主意,您可以重新設計並使其成為常規變量(以額外的分配為代價)或實例成員並使它們保持活動狀態。

該函數假定鄰接矩陣為正方形,但未顯示初始化代碼,因此應進行檢查。 可以通過使內循環條件adj_matrix[v].size() (給定節點v )來消除該假設,否則,如果該變量是不變的,則在該內循環之前添加一個斷言: assert( adj_matrix[v].size() == adj_matrix.size() && "adj_matrix is not square!" ); -成員size和自身的adj_matrix大小也一樣。

整個算法似乎比應有的復雜,從節點v開始的DFS具有以下一般形式:

dfs( v )
   set visited[ v ]
   operate on node (print node label...)
   for each node reachable from v:
      if not visited[ node ]:
         dfs( node )

您的算法似乎是(以錯誤的方式)以相反的方向橫穿了圖形。 您將給定節點設置為visited ,然后嘗試找到作為該邊緣的起點的任何節點。 也就是說,您不是在嘗試從v 到達節點,而是在嘗試獲取v可以到達的節點。 如果是這種情況(即,如果目標正在打印在v中收斂的所有路徑),則必須注意不要兩次擊中同一條邊,否則將陷入無限循環-> stackoverflow。

要看到您將以stackoverlow結尾,請考慮以下示例。 起始節點為1 創建visited矢量並將位置1標記為“訪問”。 您發現樹中有一個邊(0,1),並觸發了if: adj_matrix[0][1] != 0 && visited[1] ,因此您以遞歸方式輸入起始節點為1 這次,您無需構造輔助數據,但要注意已visited[1] ,進入循環,找到相同的邊並遞歸調用...

暫無
暫無

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

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