我有一组节点和几条边,表示连接了哪些节点。 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;
}
答案 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