printЗанятие 18

printТопологическая сортировка

Топологической сортировкой называют порядок нумерации вершин ориентированного графа, при котором любая дуга идет из вершины с меньшим номером в вершину с большим.
Для сортировки используем рекурсивный алгоритм. Перед тем как поместить `i`-ю вершину в массив `"order"`, туда нужно поместить все вершины, из которых в `i`-ю ведет дуга. Для определения циклов можно использовать специальное значение флага `"used"_i`.
int n; // число вершин
int connect[N][N]; // дуги и их ориентация
int used[N]; // флаг, что вершина помещена
             // -1, если процесс размещения не завершен
int order[N],norder; // порядок вершин и число помещенных
int topsortrec(int i)
{ 
  if(used[i]) return used[i]>0;
  used[i]=-1;
  for(int j=0; j<n; ++j)
    if(connect[j][i]) // если есть дуга j->i 
      if(!topsortrec(j)) // пытаемся поместить вершину j
        return 0;
  // все предшественники размещены
  order[norder++]=i; // кладем вершину i
  used[i]=1;
  return 1;
}
int topsort()
{
  norder=0;
  // помещаем все вершины в order
  for(int i=0; i<n; ++i)
  { if(!topsortrec(i)) 
      return 0;
  }
  return 1;
}
loading