2017-02-07 9 views
0

https://uva.onlinejudge.org/external/3/336.pdfで指定されているように、ノードがあまりにも遠い問題を解決しようとしています。私はそれのために深さ優先検索(DFS)を使用しようとしています。しかし、私は答えを得ることができません。私はDFSの再帰を使用しており、パラメータttlを関数DFSに渡しました。私が知る限り、ttlは連続する各再帰に対して減少する必要がありますが、各再帰に対して減少します。再帰で連続的に減少する変数をどのように渡すのですか? [C++]

 #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は、合格んここ コードですそれぞれの再帰呼び出しに対してのみデクリメントされますか?

編集: - 質問も私にはあいまいです。任意のノードの対の間に1つ以上の(直接的な)通信回線は存在しないと言われています。しかし、出力によれば、グラフは無向であることが示唆される。

編集: - 私はコードを編集し、指定された出力を思いついた。問題は、ノード35が40にエッジを持ち、ノード60もエッジになります。再帰が60になると、40にアクセスしますが、ttlは> 0であるため、印刷されません。しかし35には40のエッジがあるので、印刷されるはずです。これは私が立ち往生している場所です。

+0

これは非常にはっきりしていません。「ttlは連続する再帰ごとに減少する必要がありますが、再帰ごとに減少します。問題の内容を明確にしてください。 – molbdnilo

+0

「ノードのペアの間に1つ以上の(直接的な)通信回線はありません」というのは基本的にはグラフ*が無向であるということです。 – molbdnilo

+0

質問を正しく理解しているかどうかはわかりません。私の理解では、 'DFS'から' DFSUtil'に 'ttl'を減らす必要はありません。さらに、 'ttl'がゼロに達したときに再帰が終了せず、単に' DFSUtil'の出力が停止します。これは意図したものですか? – Codor

答えて

0

ttlでは問題がないようです。そこ

 if(ttl<0) 
      return; 

のような終端文である。しかし主な問題はあるはずですけれども - 配列はアドレスで渡されますので、訪問した配列は、連続した再帰によって変更されたまま。したがって、forループを反復しようとすると、以前の再帰のために訪問された配列が変更されます。 3つのノードがあり、エッジが1,2,1,3,2,3であるとすると、nodeとttlに1を与えた場合3.基本的には-
1-> 2-> 3,1 →3→2。
しかし、このコードケースでは、最初のケース1-> 2-> 3では3を既にトラバースしているので、visit [3]はtrueになり、次の繰り返しで3をスキップします。したがって、1 - > 2 - > 3しか得られません。
解決策は配列ではなく、Vectorを使用して値渡しを行うことができます。

関連する問題