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