【问题标题】:Implementing Depth First Traversal for a Graph using Adjacency Matrix C++使用邻接矩阵 C++ 为图实现深度优先遍历
【发布时间】:2012-12-30 12:17:57
【问题描述】:

我有一组节点和几条边来表示哪些节点是连接的。 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 表示断开的顶点。 现在我想使用它的邻接矩阵为这个图实现深度优先遍历。 我已经看过关于 DFS 的教程,但我很困惑如何使用我的邻接矩阵遍历它。 我只需要使用深度优先遍历来打印节点。 任何帮助将不胜感激。

// 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;
}

【问题讨论】:

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


    【解决方案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);
      }
    }
    

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

    【讨论】:

    • 我已经完全尝试过您的代码,但它没有打印深度优先遍历。在我的 main() 中,我用任何随机起始节点调用它,在我试图打印 tnode 的 dfs 中。我究竟做错了什么 ?图中的循环是什么意思我认为我的图中没有任何循环。这样它在同一个节点上开始和结束。这是一个循环吗?
    • 您无法完全尝试我的代码,因为未定义 do_operation_on 函数。恐怕我不明白您所说的“它不打印 e”是什么意思。请解释一下。
    • ~void dfs(int node) { std::stack expand;展开.push(节点); while(!expand.empty()){ int tnode=expand.top();展开.pop(); cout
    • 澄清一下——FIFO是队列,LIFO是栈——“栈,基于后进先出(LIFO)原则的抽象数据类型和数据结构”(en.wikipedia.org/wiki/Stack_(abstract_data_type))跨度>
    • @Faizan,也许您的节点有某种名称?在这种情况下,您需要将 cout&lt;&lt;tnode&lt;&lt;" " 替换为 cout&lt;&lt;name(tnode)&lt;&lt;" "
    【解决方案2】:
        #include<cstdio>
        #include<iostream>
        #include<stack>
        #include<cstring>
        using namespace std;
        int G[10][10],n;
        void dfs(int strt)
        {
            int vis[n];
            memset(vis,0,sizeof vis);
            stack<int>st;
            st.push(strt);
            while(!st.empty())
            {
                int pre=st.top();st.pop();
    
                if(!vis[pre])
                {
                    cout<<pre<<" ";
                    vis[pre]=1;
                    for(int i=n-1;i>=0;i--)
                    {
    
                        if(G[pre][i]==1 and !vis[i])
                        {
                            st.push(i);
                        }
                    }
                }
            }
            cout<<endl;
        }
        int main()
        {
            cin>>n;
            for(int i=0;i<n;i++)
               for(int j=0;j<n;j++)
                cin>>G[i][j];
            dfs(2);
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多