使用Adjacency Matrix C ++实现图的深度优先遍历

时间:2012-12-30 12:17:58

标签: c++ graph traversal depth-first-search adjacency-matrix

我有一组节点和几条边,表示连接了哪些节点。 V_nodes 1 7 22 97 48 11 V_arcs(1 22)(97 22)(7 1)(11 48)(48 7)(11 0) V_weight 1

我创建了它的邻接矩阵,显示1表示连接,0表示断开连接的顶点。 现在我想使用它的Adjacency Matrix为这个图实现Depth First Traversal。 我已经看过关于DFS的教程,但我很困惑如何使用我的邻接矩阵遍历它。 我只需要使用Depth First Traversal打印节点。 任何帮助将不胜感激。

// Prints the adjacency matrix

cout<<"Adjacency Matrix : \n";
for(int i=0;i<6;i++)
    cout<<"       "<<nodes[i].nodevalue;
cout<<endl<<endl;

for(int i=0;i<6;i++)
{
    for (int j=0;j<6;j++)
    {
        cout<<"       "<<edges[i][j];
    }
    cout<<endl<<nodes[i].nodevalue;
    cout<<endl<<endl;
}

2 个答案:

答案 0 :(得分:1)

您需要使用后置先出队列,也称为stack。您也可以使用递归,但如果图形太大,则存在堆栈溢出的风险。

对于每个节点,循环遍历节点所连接的所有节点,将它们添加到堆栈中。

将第一个节点弹出堆栈,执行您想要执行的任何操作,然后重复此过程。

这看起来像

void dfs(int node){
  std::stack<int> expand;
  expand.push(node);
  while(!expand.empty()){
    int tnode=expand.top();expand.pop();
    do_operation_on(tnode);
    for(int i=0;i<ADJACENCY_MATRIX_DIMENSION;i++)
      if(adj_matrix[tnode][i])
        expand.push(i);
  }
}

请注意,如果图表中有一个循环,则会出现问题。

答案 1 :(得分:0)

ng-controller

这里我以相反的顺序添加连接到节点的节点,它正在工作。 https://ideone.com/AGm2xe