为DFS加时间戳

时间:2014-06-13 08:39:28

标签: c++ depth-first-search

#include <iostream> 
#include <vector> 
#include <list> 

using namespace std ;

class Graph
{
public:
    Graph(int V)
    {
        this->V = V ; 
        G.resize(V) ; 
    }
    void addEdge(int v , int w)
    {
        G[v].push_back(w) ; 
        G[w].push_back(v) ;
    }
    void DFS( int s )  
    {
        bool *visited = new bool[this->V] ; 
        for( int i = 0 ; i < this->V ; i++ )
            visited[i] = false ; 

        int *arrival = new int[this->V] ; 
        int *departure = new int[this->V] ; 

        static int t = 0 ; 
        DFSUtil(s,visited,arrival,departure,t) ; // Utility function to do the DFS 
        cout << "\n" ; 
        for( int i = 0 ; i < this->V ; i++ )
            cout << arrival[i] << "/" << departure[i] << " " ; 

    }
    void printGraph() 
    {
        vector< list<int> >::iterator i ; 
        list<int>::iterator j ; 

        int k = 0 ; 
        int t = 0 ;
        for( i = G.begin() ; i != G.end() ; ++i ) 
        {
            cout << "Node " << k++ << "->" ;
            for( j = G[t].begin() ; j != G[t].end() ; ++j )
                cout << *j << "->" ; 
            cout << "NULL\n" ; 
            t++ ; 
        }
    }
private:
    int V ; // number of vertices 
    vector< list<int> > G ; // array of lists 
    void DFSUtil( int s , bool *visited , int *arrival , int *departure , int t )  // Utility function to do DFS 
    {
        cout << s << " " ; 
        visited[s] = true ; 
        arrival[s] = ++t ; 
        list<int>::iterator i ; 
        for( i = G[s].begin() ; i != G[s].end() ; ++i )
        {
            if( !visited[*i] )
                DFSUtil(*i,visited,arrival,departure,t) ; 
        }
        departure[s] = ++t ; 
    }
};

int main()
{
    // Create a graph given in the above diagram
    Graph g(6);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 2);
    g.addEdge(0, 4);
    g.addEdge(0, 3);
    g.addEdge(1, 4);
    g.addEdge(1, 5);
    g.addEdge(4, 5);
    g.addEdge(3, 5);
    g.printGraph() ;
    cout << "Following is Depth First Traversal (starting from vertex 0) \n";
    g.DFS(0);

    return 0;
}

我想为DFS的过程加时间戳,即当搜索过程到达某个特定节点然后从中进行跟踪时。我的意思是当DFS开始时它首先访问节点0所以arrival[0] = 1,然后它递归调用节点1所以arrival[1] = 2,然后递归调用节点{{1}所以2,现在节点arrival[2] = 3无法呼叫任何人,因此2应该是departure[2]随后,但我的程序输出的内容不在同一行我在期待。我认为声明时间戳变量4,因为静态可以解决问题,但它不起作用。怎么纠正呢?

1 个答案:

答案 0 :(得分:1)

“静态”在这个上下文中实质上意味着“这个函数的所有调用只共享其中一个”。
您仍然将变量的副本作为参数传递给其他函数。

如果希望被调用函数能够修改变量,则可以向其传递对该变量的引用。

删除“静态”,然后将DFSUtil更改为

void DFSUtil(int s, bool *visited, int *arrival, int *departure, int &t)