int is_checked(Queue *G, Queue *Checked_ways, int V1, int V2)
{
Node *q;
for(q = Checked_ways[V1].exclude; q != NULL; q = q->next)
if(q->vnum == V2)
return 1;
for(q = Checked_ways[V2].exclude; q != NULL; q = q->next)
if(q->vnum == V1)
return 1;
return 0;
}
void search( int v, int w, int K, Queue *G, int n, Stack *s) //v ---> w (length > k), ret in Stack
{
Queue *Checked_ways = (Queue *)calloc(n, sizeof(Queue));
int L, tmp, flag, i, j, *prev = (int *)malloc(n * sizeof(int));
Node *p, *q;
for(i = 0; i < n; ++i)
prev[i] = -1;
s->head = NULL;
for(tmp = v, L = 0, push(v, s); (tmp != w) || (L < K); )//пока не прийдем в вершину с нужным путем
{
for(flag = 0, p = G[tmp].exclude; p != NULL; p = p->next)//смотрим список смежности
if( !is_checked(G, Checked_ways, tmp, p->vnum) )//если в вершину можно пойти
{
flag = 1;
++L;
prev[p->vnum] = tmp;
tmp = p->vnum;
enq(prev[tmp], &Checked_ways[tmp]);//блокируем ребро
enq(tmp, &Checked_ways[prev[tmp]]);
push(p->vnum, s);//добавляем в путь
break;
}
if(!flag)
{
del_queue(&Checked_ways[tmp]);//освобождаем тупиковую вершину от запретов
enq(tmp, &Checked_ways[prev[tmp]]);
enq(prev[tmp], &Checked_ways[tmp]);
--L;
if(pop(s) == v && L == 0)
{
printf("No way :C");
del_stack(s);
return;
}
tmp = prev[tmp];
}
}
return;
}