以下に示すような双方向グラフがあるとします。
これで、ソース 8 からの DFS Traversal は 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 に達したときに 0 にリセットする必要があります。そうしないと、上記の関数に従って、dist[6] は 1+ dist[3] になります。これを克服する方法は?また、これを達成するためのより効率的な方法はありますか?