Вы реализовали стек, то есть LIFO (последний пришел первым - вышел): вы добавляете в конец и извлекаете из конца.
Вы должны реализовать очередь, то есть FIFO (сначала в порядке очереди), поэтому, если вы добавите в конец, вы должны получить спереди:
void pop()
{
if (size)
{
queue *ptr=head;
head=head->next;
if (head) head->prev=NULL;
free(ptr);
}
}
int front()
{
return head->val;
}
Кроме того, я думаю, ваша цель состоит в том, чтобыпосчитайте наименьшее количество операций, необходимых для получения желаемого числа из заданного.Ваша переменная cnt
не представляет наименьшее количество операций, она представляет количество раз, которое вы извлекли элемент из очереди.Вам нужно увеличить его для каждого нового уровня .
Наконец, ваш bfs
должен возвращать значение, даже если нет пути от s
до d
, поэтому вы должны поставить return 0;
после цикла while(size){}
.
UPD.Вам нужно пропустить g[u][j]
, если оно больше 2 * (10^4)
внутри bfs
, в противном случае эти значения будут помещены в очередь, что является пустой тратой пространства.Кстати, в вашем v
массиве всего 2222 элемента, он должен содержать не менее 20001 (v[20000]
- последний)