#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <unistd.h>
#define skipnotdigit(n) while( 0 == isdigit(*n)) (n)++
#define skipdigit(n) while( isdigit(*n)) (n)++
#define push(a, b) {*a = b; a++;} while (0)
#define pop(a, b) {a--; b = *a;} while (0)
int main(void)
{
char input[10000] = {0};
{
unsigned int i = 0;
int c;
while
(
(i < sizeof(input)) // Чтобы буфер не переполнили мне тут
)
{
input[i]=c;
i++;
}
}
//read(STDIN_FILENO, input, sizeof(input[0])*sizeof(input));
unsigned int a;
// int asd;
if (sscanf(input
, "%u", &a
) != 1) // чтение количества вершин в графе {
return EXIT_FAILURE;
}
unsigned int n1;
void *memmalloc
= malloc(sizeof(unsigned int) * (a
* (a
+ 1) + a
+ 2 * a
)); //Память для матрицы, расстояний от нулевой вершины и двух стеков.
if (memmalloc == NULL)
{
return EXIT_FAILURE;
}
unsigned int *matrix = memmalloc;
unsigned int * mt_p;
//матрица, которая будет содержать в себе граф
//и указатель, который будет по матрице бегать
memset(matrix
, 0x00, sizeof(unsigned int)* a
* (a
+ 1)); //malloc не инициализирует память, поэтому надо записать сюда нули
char * inp_p = &input[0]; //указатель на входные данные
//char buffer[8] = {};
char buffer[9] = {0};
// временный буфер, который чтобы числа в него читать
// и чтобы потом через atoi преобразовывать в число
char * buf_p = buffer;
skipnotdigit(inp_p); //Этот кусок кода нужен для того,
skipdigit(inp_p); //чтобы пропустить первое число,
//задающее количество вершин графа
for(n1 = 0; n1 < a; n1++)
{
skipnotdigit(inp_p);
mt_p = matrix + n1 * (a+1);
do
{
do
{
*buf_p = *inp_p; // копирование аскии-кодов циферок в буфер
buf_p++; inp_p++; // Увеличим и то и другое
}
buf_p = buffer;
memset(buffer
, 0x00, sizeof(buffer
) * sizeof(buffer
[0]));
if (*mt_p == 0) // Обработка нуля.
{
break; // Если ноль, заполнять вторую строчку
}
mt_p++; // Иначе Заполняем следующий элемент в матрице
} while (1);
}
unsigned int *dist = &matrix[a * (a + 1)];
//Массив с расстояниями до нулевой вершины. Расположен после двумерной матрицы.
memset(dist
, 0xFF, sizeof(*dist
) * a
); dist[0]= 0;
unsigned int *stack[2];
stack[0] = &dist[1 * a]; //Первый стек идет после массива с расстояниями
stack[1] = &dist[2 * a]; //Второй стек идет после первого стека
stack[0][0] = 0;
stack[0][1] = 0;
unsigned int *stackp[2];
stackp[0] = stack[0];
stackp[1] = stack[1];
mt_p = matrix;
unsigned int steps=0;
unsigned char one_zero = 0;
push(stackp[one_zero], 0);
//нужно обработать то, что связано с самой первой вершиной, которая у нас нулевая
do
{
steps++;
do
{
pop(stackp[one_zero], n1);
//n1 - номер вершины. Берем из стека
mt_p = matrix + (a + 1) * n1;
//ставит указатель на нужную строчку. В строчке список вершин, заканчивающихся нулем
while ( (*mt_p) != 0)
{ // Пока не появится ноль, означающий что эта вершина больше ни с чем не соединена
if ( dist[(*mt_p)-1] > steps )
{ // Если до той вершины графа еще не дошагали за меньшее число ходов
dist[(*mt_p)-1] = steps;
// Вносим туда наше число шагов
push(stackp[one_zero^1], (*mt_p)-1);
// Вносим номер вершины в стек, чтобы потом посмотреть, с чем соединена та вершина
}
mt_p++;
//смотрим, с какой следующей вершина связана эта вершина (если с никаким, *mt_p будет равен нулю )
}
} while ( stackp[one_zero] > stack[one_zero] );
one_zero ^= 1;
// Переключалка из нуля в единицу и наоборот
} while (stackp[one_zero] > stack[one_zero]);
for (unsigned int i = 0; i != a-1; i++)
{
}
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2RlZmluZSBza2lwbm90ZGlnaXQobikgICB3aGlsZSggMCA9PSBpc2RpZ2l0KCpuKSkgKG4pKysKI2RlZmluZSBza2lwZGlnaXQobikgICAgICB3aGlsZSggaXNkaWdpdCgqbikpIChuKSsrCiNkZWZpbmUgcHVzaChhLCBiKSAgICAgICAgeyphID0gYjsgYSsrO30gd2hpbGUgKDApCiNkZWZpbmUgcG9wKGEsIGIpICAgICAgICAge2EtLTsgYiA9ICphO30gd2hpbGUgKDApCgoKaW50IG1haW4odm9pZCkKewogIGNoYXIgaW5wdXRbMTAwMDBdID0gezB9OyAKICB7CiAgICB1bnNpZ25lZCBpbnQgaSA9IDA7CiAgICBpbnQgYzsKICAgIHdoaWxlCiAgICAoCiAgICAgKChjID0gZ2V0Y2hhcigpKSAhPSBFT0YpICYmCiAgICAgKGkgPCBzaXplb2YoaW5wdXQpKSAvLyDQp9GC0L7QsdGLINCx0YPRhNC10YAg0L3QtSDQv9C10YDQtdC/0L7Qu9C90LjQu9C4INC80L3QtSDRgtGD0YIKICAgICkKICAgIHsKICAgICAgZnByaW50ZihzdGRlcnIsIiElYyEiLCBjKTsKICAgICAgaW5wdXRbaV09YzsKICAgICAgaSsrOwogICAgfQogICAgZnByaW50ZihzdGRlcnIsIiElYyEiLCBjKTsKICB9CgogIC8vcmVhZChTVERJTl9GSUxFTk8sIGlucHV0LCBzaXplb2YoaW5wdXRbMF0pKnNpemVvZihpbnB1dCkpOyAKCiAgdW5zaWduZWQgaW50IGE7Ci8vICBpbnQgYXNkOwogIGlmIChzc2NhbmYoaW5wdXQsICIldSIsICZhKSAhPSAxKSAvLyDRh9GC0LXQvdC40LUg0LrQvtC70LjRh9C10YHRgtCy0LAg0LLQtdGA0YjQuNC9INCyINCz0YDQsNGE0LUKICB7CiAgCXJldHVybiBFWElUX0ZBSUxVUkU7CiAgfQogIHVuc2lnbmVkIGludCBuMTsKICB2b2lkICptZW1tYWxsb2MgPSAgbWFsbG9jKHNpemVvZih1bnNpZ25lZCBpbnQpICogKGEgKiAoYSArIDEpICsgYSArIDIgKiBhKSk7CiAgLy/Qn9Cw0LzRj9GC0Ywg0LTQu9GPINC80LDRgtGA0LjRhtGLLCDRgNCw0YHRgdGC0L7Rj9C90LjQuSDQvtGCINC90YPQu9C10LLQvtC5INCy0LXRgNGI0LjQvdGLINC4INC00LLRg9GFINGB0YLQtdC60L7Qsi4KICBpZiAobWVtbWFsbG9jID09IE5VTEwpCiAgewogICAgcGVycm9yKCJtYWxsb2MgZmFpbGVkIik7CiAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogIH0KICB1bnNpZ25lZCBpbnQgKm1hdHJpeCA9IG1lbW1hbGxvYzsKICB1bnNpZ25lZCBpbnQgKiBtdF9wOwogIC8v0LzQsNGC0YDQuNGG0LAsINC60L7RgtC+0YDQsNGPINCx0YPQtNC10YIg0YHQvtC00LXRgNC20LDRgtGMINCyINGB0LXQsdC1INCz0YDQsNGECiAgLy/QuCDRg9C60LDQt9Cw0YLQtdC70YwsINC60L7RgtC+0YDRi9C5INCx0YPQtNC10YIg0L/QviDQvNCw0YLRgNC40YbQtSDQsdC10LPQsNGC0YwKCiAgbWVtc2V0KG1hdHJpeCwgMHgwMCwgc2l6ZW9mKHVuc2lnbmVkIGludCkqIGEgKiAoYSArIDEpKTsKICAvL21hbGxvYyDQvdC1INC40L3QuNGG0LjQsNC70LjQt9C40YDRg9C10YIg0L/QsNC80Y/RgtGMLCDQv9C+0Y3RgtC+0LzRgyDQvdCw0LTQviDQt9Cw0L/QuNGB0LDRgtGMINGB0Y7QtNCwINC90YPQu9C4CgogIGNoYXIgKiBpbnBfcCA9ICZpbnB1dFswXTsgLy/Rg9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDQstGF0L7QtNC90YvQtSDQtNCw0L3QvdGL0LUKCiAgLy9jaGFyIGJ1ZmZlcls4XSA9IHt9OwogIGNoYXIgYnVmZmVyWzldID0gezB9OwogIC8vINCy0YDQtdC80LXQvdC90YvQuSDQsdGD0YTQtdGALCDQutC+0YLQvtGA0YvQuSDRh9GC0L7QsdGLINGH0LjRgdC70LAg0LIg0L3QtdCz0L4g0YfQuNGC0LDRgtGMCiAgLy8g0Lgg0YfRgtC+0LHRiyDQv9C+0YLQvtC8INGH0LXRgNC10LcgYXRvaSDQv9GA0LXQvtCx0YDQsNC30L7QstGL0LLQsNGC0Ywg0LIg0YfQuNGB0LvQvgoKICBjaGFyICogYnVmX3AgPSBidWZmZXI7CgoKICBza2lwbm90ZGlnaXQoaW5wX3ApOyAgICAgLy/QrdGC0L7RgiDQutGD0YHQvtC6INC60L7QtNCwINC90YPQttC10L0g0LTQu9GPINGC0L7Qs9C+LAogIHNraXBkaWdpdChpbnBfcCk7ICAgICAgICAvL9GH0YLQvtCx0Ysg0L/RgNC+0L/Rg9GB0YLQuNGC0Ywg0L/QtdGA0LLQvtC1INGH0LjRgdC70L4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v0LfQsNC00LDRjtGJ0LXQtSDQutC+0LvQuNGH0LXRgdGC0LLQviDQstC10YDRiNC40L0g0LPRgNCw0YTQsAogIAogIGZvcihuMSA9IDA7IG4xIDwgYTsgbjErKykKICB7CiAgICBza2lwbm90ZGlnaXQoaW5wX3ApOwogIAogICAgbXRfcCA9IG1hdHJpeCArIG4xICogKGErMSk7CiAgICBkbwogICAgewogICAgICBkbwogICAgICB7CiAgICAgICAgKmJ1Zl9wID0gKmlucF9wOyAgLy8g0LrQvtC/0LjRgNC+0LLQsNC90LjQtSDQsNGB0LrQuNC4LdC60L7QtNC+0LIg0YbQuNGE0LXRgNC+0Log0LIg0LHRg9GE0LXRgAogICAgICAgIGJ1Zl9wKys7IGlucF9wKys7IC8vINCj0LLQtdC70LjRh9C40Lwg0Lgg0YLQviDQuCDQtNGA0YPQs9C+0LUKICAgICAgfQogICAgICB3aGlsZShpc2RpZ2l0KCppbnBfcCkpOwogIAogIAogICAgICAqbXRfcCA9IGF0b2koYnVmZmVyKTsKICAgICAgYnVmX3AgID0gYnVmZmVyOwogICAgICBtZW1zZXQoYnVmZmVyLCAweDAwLCBzaXplb2YoYnVmZmVyKSAqIHNpemVvZihidWZmZXJbMF0pKTsKICAKICAgICAgaWYgKCptdF9wID09IDApICAvLyDQntCx0YDQsNCx0L7RgtC60LAg0L3Rg9C70Y8uCiAgICAgIHsKICAgICAgICBicmVhazsgICAgICAvLyDQldGB0LvQuCDQvdC+0LvRjCwg0LfQsNC/0L7Qu9C90Y/RgtGMINCy0YLQvtGA0YPRjiDRgdGC0YDQvtGH0LrRgwogICAgICB9CiAgICAgIG10X3ArKzsgLy8g0JjQvdCw0YfQtSDQl9Cw0L/QvtC70L3Rj9C10Lwg0YHQu9C10LTRg9GO0YnQuNC5INGN0LvQtdC80LXQvdGCINCyINC80LDRgtGA0LjRhtC1CiAgICB9IHdoaWxlICgxKTsKICAKICB9CiAgCiAgCiAgdW5zaWduZWQgaW50ICpkaXN0ID0gJm1hdHJpeFthICogKGEgKyAxKV07CiAgLy/QnNCw0YHRgdC40LIg0YEg0YDQsNGB0YHRgtC+0Y/QvdC40Y/QvNC4INC00L4g0L3Rg9C70LXQstC+0Lkg0LLQtdGA0YjQuNC90YsuINCg0LDRgdC/0L7Qu9C+0LbQtdC9INC/0L7RgdC70LUg0LTQstGD0LzQtdGA0L3QvtC5INC80LDRgtGA0LjRhtGLLgogIAogIG1lbXNldChkaXN0LCAweEZGLCBzaXplb2YoKmRpc3QpICogYSk7CiAgZGlzdFswXT0gMDsKICAKICB1bnNpZ25lZCBpbnQgKnN0YWNrWzJdOwogIHN0YWNrWzBdID0gJmRpc3RbMSAqIGFdOyAvL9Cf0LXRgNCy0YvQuSDRgdGC0LXQuiDQuNC00LXRgiDQv9C+0YHQu9C1INC80LDRgdGB0LjQstCwINGBINGA0LDRgdGB0YLQvtGP0L3QuNGP0LzQuAogIHN0YWNrWzFdID0gJmRpc3RbMiAqIGFdOyAvL9CS0YLQvtGA0L7QuSDRgdGC0LXQuiDQuNC00LXRgiDQv9C+0YHQu9C1INC/0LXRgNCy0L7Qs9C+INGB0YLQtdC60LAKICAKICBzdGFja1swXVswXSA9IDA7CiAgc3RhY2tbMF1bMV0gPSAwOwogIAogIHVuc2lnbmVkIGludCAqc3RhY2twWzJdOwogIHN0YWNrcFswXSA9IHN0YWNrWzBdOwogIHN0YWNrcFsxXSA9IHN0YWNrWzFdOwoKICAKICBtdF9wID0gbWF0cml4OwogIAogIHVuc2lnbmVkIGludCBzdGVwcz0wOwogIAogIHVuc2lnbmVkIGNoYXIgb25lX3plcm8gPSAwOwogIAogIHB1c2goc3RhY2twW29uZV96ZXJvXSwgMCk7CiAgLy/QvdGD0LbQvdC+INC+0LHRgNCw0LHQvtGC0LDRgtGMINGC0L4sINGH0YLQviDRgdCy0Y/Qt9Cw0L3QviDRgSDRgdCw0LzQvtC5INC/0LXRgNCy0L7QuSDQstC10YDRiNC40L3QvtC5LCDQutC+0YLQvtGA0LDRjyDRgyDQvdCw0YEg0L3Rg9C70LXQstCw0Y8KCgogIGRvCiAgewogICAgc3RlcHMrKzsKICAgIGRvCiAgICB7CiAgICAgIHBvcChzdGFja3Bbb25lX3plcm9dLCBuMSk7CiAgICAgIC8vbjEgLSDQvdC+0LzQtdGAINCy0LXRgNGI0LjQvdGLLiDQkdC10YDQtdC8INC40Lcg0YHRgtC10LrQsAoKICAgICAgbXRfcCA9IG1hdHJpeCArIChhICsgMSkgKiBuMTsKICAgICAgLy/RgdGC0LDQstC40YIg0YPQutCw0LfQsNGC0LXQu9GMINC90LAg0L3Rg9C20L3Rg9GOINGB0YLRgNC+0YfQutGDLiDQkiDRgdGC0YDQvtGH0LrQtSDRgdC/0LjRgdC+0Log0LLQtdGA0YjQuNC9LCDQt9Cw0LrQsNC90YfQuNCy0LDRjtGJ0LjRhdGB0Y8g0L3Rg9C70LXQvAogICAgCiAgICAgIHdoaWxlICggKCptdF9wKSAhPSAwKQogICAgICB7ICAvLyDQn9C+0LrQsCDQvdC1INC/0L7Rj9Cy0LjRgtGB0Y8g0L3QvtC70YwsINC+0LfQvdCw0YfQsNGO0YnQuNC5INGH0YLQviDRjdGC0LAg0LLQtdGA0YjQuNC90LAg0LHQvtC70YzRiNC1INC90Lgg0YEg0YfQtdC8INC90LUg0YHQvtC10LTQuNC90LXQvdCwCiAgICAgICAgaWYgKCBkaXN0WygqbXRfcCktMV0gPiBzdGVwcyApCiAgICAgICAgeyAvLyDQldGB0LvQuCDQtNC+INGC0L7QuSDQstC10YDRiNC40L3RiyDQs9GA0LDRhNCwINC10YnQtSDQvdC1INC00L7RiNCw0LPQsNC70Lgg0LfQsCDQvNC10L3RjNGI0LXQtSDRh9C40YHQu9C+INGF0L7QtNC+0LIKICAgICAgICAgIGRpc3RbKCptdF9wKS0xXSA9IHN0ZXBzOwogICAgICAgICAgLy8g0JLQvdC+0YHQuNC8INGC0YPQtNCwINC90LDRiNC1INGH0LjRgdC70L4g0YjQsNCz0L7QsgogICAgICAgICAgcHVzaChzdGFja3Bbb25lX3plcm9eMV0sICgqbXRfcCktMSk7IAogICAgICAgICAgLy8g0JLQvdC+0YHQuNC8INC90L7QvNC10YAg0LLQtdGA0YjQuNC90Ysg0LIg0YHRgtC10LosINGH0YLQvtCx0Ysg0L/QvtGC0L7QvCDQv9C+0YHQvNC+0YLRgNC10YLRjCwg0YEg0YfQtdC8INGB0L7QtdC00LjQvdC10L3QsCDRgtCwINCy0LXRgNGI0LjQvdCwCiAgICAgICAgfQoKICAgICAgICBtdF9wKys7CiAgICAgICAgLy/RgdC80L7RgtGA0LjQvCwg0YEg0LrQsNC60L7QuSDRgdC70LXQtNGD0Y7RidC10Lkg0LLQtdGA0YjQuNC90LAg0YHQstGP0LfQsNC90LAg0Y3RgtCwINCy0LXRgNGI0LjQvdCwICjQtdGB0LvQuCDRgSDQvdC40LrQsNC60LjQvCwgKm10X3Ag0LHRg9C00LXRgiDRgNCw0LLQtdC9INC90YPQu9GOICkKICAgICAgfQogICAgfSB3aGlsZSAoIHN0YWNrcFtvbmVfemVyb10gPiBzdGFja1tvbmVfemVyb10gKTsKICAgIG9uZV96ZXJvIF49IDE7CiAgICAvLyDQn9C10YDQtdC60LvRjtGH0LDQu9C60LAg0LjQtyDQvdGD0LvRjyDQsiDQtdC00LjQvdC40YbRgyDQuCDQvdCw0L7QsdC+0YDQvtGCCgogIH0gd2hpbGUgKHN0YWNrcFtvbmVfemVyb10gPiBzdGFja1tvbmVfemVyb10pOwoKCiAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgIT0gYS0xOyBpKyspCiAgewogICAgcHJpbnRmKCIlaSAiLCBkaXN0W2ldKTsKICB9CiAgcHJpbnRmKCJcbiIpOwoKICBmcmVlKG1lbW1hbGxvYyk7CiAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKfQ==