簡體   English   中英

如何在遞歸中傳遞連續遞減的變量? [C ++]

[英]How do I pass a continously decreasing variable in recursion ? [C++]

我正在嘗試解決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的邊也為40。當遞歸進行到60時,它訪問40,但是由於ttl > 0,所以它不會被打印。 但是由於35具有40的邊緣,因此應該將其打印出來。 這就是我卡住的地方。

看來問題不在於ttl。 雖然應該有一個終止聲明,例如

        if(ttl<0)
           return;

但是主要的問題是-由於數組是通過地址傳遞的,因此訪問的數組仍會通過連續遞歸進行修改。 因此,一旦它嘗試遍歷for循環,由於先前的遞歸而被訪問的數組將被修改。 假設,如果有3個節點,並且邊為1 2、1 3、23。則如果給定node和ttl為1 3,則它基本上應為-
1-> 2-> 3,1-> 3-> 2。
但是在這種代碼情況下,由於在第一種情況下1-> 2-> 3,它已經遍歷了3,所以visited [3]變為true,導致它在下一次迭代中跳過3。 因此,它僅給出1-> 2-> 3。
解決方案是代替array,您可以使用Vector使它按值傳遞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM