#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
,因为静态可以解决问题,但它不起作用。怎么纠正呢?
答案 0 :(得分:1)
“静态”在这个上下文中实质上意味着“这个函数的所有调用只共享其中一个”。
您仍然将变量的副本作为参数传递给其他函数。
如果希望被调用函数能够修改变量,则可以向其传递对该变量的引用。
删除“静态”,然后将DFSUtil
更改为
void DFSUtil(int s, bool *visited, int *arrival, int *departure, int &t)