158
{
ClearVisit();
int result = FindDepth(n, nameNode);
return result;
}
Перед начальным вызовом рекурсивной
процедуры неоходимо очи-
стить поле
visit у каждой вершины. Это делает функция
ClearVisit() (лис-
тинг 5.21). Попутно эта функция также
обнуляет поле номера визита num-
Visit
и назначает всем дугам серый цвет.
Листинг 5.21. Первоначальная очистка узлов
void ClearVisit()
{
int N = Nodes.Length; Lib.Num = 0;
for (int i = 0; i < N; i++)
{
Nodes[i].visit
=
false;
Nodes[i].numVisit
=
0;
Nodes[i].color
=
Color.White;
int L = Nodes[i].Edge.Length;
for (int j = 0; j < L; j++)
Nodes[i].Edge[j].color = Color.Silver;
}
}
При посещении узла мы
должны изменить значение поля visit на
true
, и этим занимается функция
VisitTrue() (листинг 5.22). Попутно эта
функция назначает вершине очередной номер визита.
Листинг 5.22. Посещение узла
void VisitTrue(int n) //
отметить посещенный
{
Nodes[n].visit = true;
Lib.Num++;
20 / 23
159
Nodes[n].numVisit = Lib.Num;
}
Алгоритм поиска в глубину является одним из
фундаментальных для
графов, поэтому мы приведем и его нерекурсивную версию, которая исполь-
зует стек. В терминах псевдоязыка алгоритм можно записать так, как приве-
дено в листинг 5.23.
Do'stlaringiz bilan baham: