//здесь мы обходим вершины транспонированного графа и добавляем их в стек по порядку обработки
Stack dfs(Queue *Gt, int n)
{
int i, v, flag;
int *visited = (int *)malloc(n * sizeof(int));
Stack MyStack, order;
Node *p;
MyStack.head = NULL;
order.head = NULL;
for( i = 0; i < n; ++i ) visited[i] = 0;
for(v = 0; v < n; ++v)
{
if(!visited[v])
{
push(v, &MyStack);
while(!is_empty_stack(&MyStack))
{
v = top(&MyStack);
p = Gt[v].exclude;
for(flag = 1; p != NULL; p = p->next)
if(!visited[p->vnum])
{
flag = 0;
push(p->vnum, &MyStack);
}
visited[v] = 1;
if(flag)
push(pop(&MyStack), &order);
}
}
}
del_stack(&MyStack);
free(visited);
return order;
}
//обход, но уже в порядке обхода - т.е. по компонентам
int compounds(Queue *G, int n, Stack S)
{
int i, v, flag, ret = 0;
int *visited = (int *)malloc(n * sizeof(int));
Stack MyStack;
Node *p;
assert(visited);
MyStack.head = NULL;
for( i = 0; i < n; ++i ) visited[i] = 0;
while(!is_empty_stack(&S))
{
v = pop( &S );
if(!visited[v])
{
ret++;
push(v, &MyStack);
while(!is_empty_stack(&MyStack))
{
v = top(&MyStack);
p = G[v].exclude;
for(flag = 1; p != NULL; p = p->next)
if(!visited[p->vnum])
{
flag = 0;
push(p->vnum, &MyStack);
}
visited[v] = 1;
if(flag)
pop(&MyStack);
}
}
}
del_stack(&MyStack);
del_stack(&S);
free(visited);
return ret;
}