int count(stack *s) // счёт количества ходов в стеке
{
int num = 0;
while (s->pr != NULL) // пока стек не пуст
{
num ++; // наращиваем счётчик
s = s->pr;
}
return num;
}
int check(stack *head) // проверка не было ли на этой вершине ранее
{
stack *s = head->pr; // пока стек не пуст
while (s != NULL)
{
if (s->numb == head->numb) return 1; // если вершины совпадют возвращаем истину
s = s->pr;
}
return 0;
}
stack* minway(stack *s, int numb) // поиск минимального пути
{
stack *nw;
stack* min = NULL;
int tmp_int;
stack *tmp_st;
int i;
nw = (stack *) calloc(1, sizeof(stack)); // буфер
nw->numb = numb;
nw->pr = s;
if (nw->numb == end) return nw; // если текущая вершина совпадает с конечной, то путь
// (не обязательно конечный) найден
if (check(nw) != 0)
{ // если на текущей вершине уже находились,
free(nw); // то этот путь не может быть кратчайшим,
return NULL; // поэтому дальше не идём и возвращаем NULL
}
for (i = 1; i < n + 1; i++) // перебор вершин
if (m[nw->numb][i] != 0)
{ // если из текущей вершины есть переход в i-тую
tmp_st = minway(nw, i); // то запускаем функцию снова
if (tmp_st == NULL) continue;
tmp_int = count(tmp_st);
if (tmp_int != -1 && (min == NULL || tmp_int < count(min))) min = tmp_st;
}
return min; // возвращаем минимальное количество ходов
}
void course(stack *h)
{
if (h->pr) course(h->pr); // выводим стек в обратном порядке
printf("%d\t", h->numb);
}
void output(stack *h) //вывод количества шагов
{
if (h == NULL)
{
puts("Введите вершины корректно!");
return;
}
printf("Минимальное количество шагов: %d\n", count(h));
course(h);
}
int main()
{
int i;
int a, b;
setlocale(LC_ALL , ".1251");
do
{
printf("Введите количество вершин: "); // ввод количества вершин
scanf("%d", &n);
}
while (n <= 0);
m = (int**) malloc((n + 1)*sizeof(int*)); // создание матрицы переходов
for (i = 0; i < n + 1; i++) m[i] = (int*)calloc(n + 1, sizeof(int));
puts("Введите переходы между вершинами (0 - признак конца ввода)");
do
{
scanf("%d %d", &a, &b); // ввод переходов между вершинами
if (a >= 0 && a <= n && b >= 0 && b <=n) m[a][b] = m[b][a] = 1;
else puts("Введены некорректные вершины");
}
while (a != 0);
do // задание начальной точки
{
puts("Введите начальную вершину");
scanf("%d", &a);
}
while (a < 1 || a > n);
do
{
puts("Введите конечную вершину"); // задание конечной точки
scanf("%d", &end);
}
while (end < 1 || end > n);
output(minway(NULL, a)); // поиск мин. пути
getch();
return 0;
}
Результат выполнения программы
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.