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のエッジがあるので、印刷されるはずです。これは私が立ち往生している場所です。
これは非常にはっきりしていません。「ttlは連続する再帰ごとに減少する必要がありますが、再帰ごとに減少します。問題の内容を明確にしてください。 – molbdnilo
「ノードのペアの間に1つ以上の(直接的な)通信回線はありません」というのは基本的にはグラフ*が無向であるということです。 – molbdnilo
質問を正しく理解しているかどうかはわかりません。私の理解では、 'DFS'から' DFSUtil'に 'ttl'を減らす必要はありません。さらに、 'ttl'がゼロに達したときに再帰が終了せず、単に' DFSUtil'の出力が停止します。これは意図したものですか? – Codor