如何在递归中传递不断递减的变量? [C ++]

时间:2017-02-07 14:43:03

标签: c++ recursion graph depth-first-search onlinejudge

我正在尝试解决https://uva.onlinejudge.org/external/3/336.pdf中指定的节点太远的问题。我正在尝试使用深度优先搜索(DFS)。但我无法得到答案。我正在使用递归进行DFS,并且已将参数ttl传递给函数DFS。据我所知ttl需要减少每次连续的递归,但它会在每次递归时递减。 这是代码: -

        #include<iostream>
        #include<list>
        #include<stdio.h>

        using namespace std;

        class Graph
        {
            int V;
            list<int> *adj;
            public:
                Graph(int V);
                void addEdge(int v, int w);
                void DFSUtil(int v, bool visited[], int ttl);
                void DFS(int s, int ttl);
        };

        Graph::Graph(int V)
        {
            this->V = V;
            adj = new list<int>[V];
        }

        void Graph::addEdge(int v, int w)
        {
            adj[v].push_back(w);
            adj[w].push_back(v);
        }

        void Graph::DFSUtil(int v, bool visited[], int ttl)
        {
            visited[v] = true;
            cout << endl;
            int k = ttl;
            if(k>=0)
            {
                cout << ttl <<  " " << v ;
                list<int>::iterator i;
                for(i = adj[v].begin(); i!=adj[v].end(); ++i)
                {
                    if(!visited[*i])
                    {
                        int b = ttl - 1;
                        DFSUtil(*i, visited, b);
                    }
                }
            }
        }

        void Graph::DFS(int s, int ttl)
        {
            bool *visited = new bool[V];
            for(int i = 0; i < V; i++)
            {
                visited[i] = false;
            }
            DFSUtil(s, visited,ttl);
        }

        int main()
        {
            Graph g(100);
            int nc;
            while(scanf("%d",&nc))
            {
                if(nc == 0)
                {
                    break;
                }
                for(int i = 0; i < nc; i++)
                {
                    int v, w;
                    cin >> v >> w;
                    g.addEdge(v, w);
                }
                int s, ttl;
                while(scanf("%d%d",&s,&ttl))
                {
                    if(s == 0 && ttl == 0)
                    {
                        break;
                    }
                    g.DFS(s, ttl);
                }
            }
            return 0;
        }

输入为: -

       16
       10 15 15 20 20 25 10 30 30 47 47 50 25 45 45 65
       15 35 35 55 20 40 50 55 35 40 55 60 40 60 60 65
       35 2 35 3 0 0
       0  

,输出为: -

2 35
1 15
0 10

0 20


1 55
0 50

0 60

那么我如何传递ttl,使其仅针对相应的递归调用递减?

编辑: - 这个问题对我来说似乎也很模糊。它表示任何节点对之间只有一条(直接)通信线路。但是,根据输出,它表明图表是无向的。

编辑: - 我编辑了代码并提出了给定的输出。问题是节点35的边缘为40,节点60也是如此。当递归转到60时,它访问40但是因为ttl是&gt; 0,它没有打印。但是因为35有40的边缘,它应该打印出来。这就是我被困住的地方。

1 个答案:

答案 0 :(得分:0)

似乎问题不在于ttl。虽然应该有一个终止声明,如

        if(ttl<0)
           return;

但主要问题是 - 由于数组是通过地址传递的,因此访问数组仍会通过连续递归进行修改。因此,一旦它尝试迭代for循环,由于先前的递归而访问的数组被修改。假设,如果有3个节点,并且边是1 2 1,2 3 3.那么如果我们给node和ttl为1 3.那么它应该基本上给出 -
1→2→3,1-将3-→2
。 但是在这个代码情况下,因为在第一种情况下1-> 2> 3,它已经遍历了3,所以访问[3]变为真,导致它在下一次迭代中跳过3。因此,它仅给出1-> 2-> 3 解决方案是代替数组,您可以使用Vector使其按值传递。