/* Функция обхода графа в ширину, начиная с вершины v */
void round (int v)
/* Глоб. данные:
g [NMAX][NMAX] – м-ца смежности,
n – число вершин,
visit [NMAX] – вектор посещ. вершин */
{ int och [NMAX]; /* очередь вершин на посещение */
int in, ik; // индексы начала и конца очереди
int w; // очередная вершина
in = ik = 0; // инициализация очереди
och [ik++] = v; visit [v ] = 1;
do
{ /* посещение вершины, первой в очереди, и удаление ее из очереди */
v = och [in++];
/* поиск непосещенных смежных с v вершин и добавление их в очередь */
for (w = 0; w<n; w++)
if (g[v][w] && visit[w] == 0)
{ och [ik++] = w; visit[w] = 1; }
}
while (in != ik); // очередь не пустая
}
В векторе visit можно хранить дерево кратчайших путей от каждой вершины до начальной (дуги направлены к корню). Для этого в элемент visit [w] следует записывать не 1, а вершину v, предшествующую вершине w в дереве кратчайших путей. До обхода вектор visit нужно заполнить -1, а не нулями.