如何在递归调用中维护值?

时间:2014-12-20 12:01:19

标签: recursion graph dfs

让我们来说,我们有一个双向图,如下所示

enter image description here

现在,它来自源8的DFS遍历将是8 1 2 3 6 7 4 5。 递归实现

vector <int>  v[10001];
bool visited[10001];
void DFS(int s)
{
 visited[s]=true;
 cout<<s<<" ";
 for(int i=0;i<v[s].size();i++)
 {

 if(!visited[v[s][i]])
 {
     DFS(v[s][i]);
 }
 }
}

因此,首先它将递归地变为8-> 1-> 2-> 3,8-> 6,8-> 7-> 4-> 5

现在,使用此功能,我还想跟踪每个节点距离它的来源的距离。 我们将其称为dist [N],其中N =节点数。 在此图中     DIST [8] = 0,     DIST 1 = 1,     DIST [2] = 2  等等。我该如何实现呢?

首先,我尝试保留变量d并将其递增,如下面的代码所示

int d=0;
void DFS(int s)
{
 visited[s]=true;
 cout<<s<<" ";
 dist[s]=d;
 d++;
 for(int i=0;i<v[s].size();i++)
 {
 if(!visited[v[s][i]])
 {
     DFS(v[s][i]);
 }
 }
}

但显然,当d再次达到8时,d的值必须重置为0,根据上述函数,其他明智的dist [6]将是1+ dist [3]。怎么克服这个?还有,有一些更有效的方法来实现这一目标吗?

1 个答案:

答案 0 :(得分:0)

它不是具有全局变量跟踪深度,而是可以作为下一次迭代的参数。

void DFS(int s, int d)
{
 visited[s]=true;
 cout<<s<<" ";
 dist[s]=d;
 for(int i=0;i<v[s].size();i++)
 {
     if(!visited[v[s][i]])
    {
       DFS(v[s][i], d+1);
    }
 }
}