Алгоритм обхода в ширину не проходит проверку

Рейтинг: -1Ответов: 1Опубликовано: 20.03.2023

Задача:

В неориентированном графе требуется найти длину кратчайшего пути между двумя вершинами.

Входные данные

Во входном файле INPUT.TXT записано сначала число N - количество вершин в графе (1 ≤ N ≤ 100). Затем записана матрица смежности (0 обозначает отсутствие ребра, 1 - наличие ребра). Затем записаны номера двух вершин - начальной и конечной.

Выходные данные

В выходной файл OUTPUT.TXT выведите длину кратчайшего пути. Если пути не существует, выведите одно число -1.

Ссылка на задание и там же проверяется: https://acmp.ru/index.asp?main=task&id_task=127

Пример: Ввод:

5
0 1 0 0 1
1 0 1 0 0
0 1 0 0 0
0 0 0 0 0
1 0 0 0 0
3 5

Вывод:

3

Мой код:

def search_width(n: int, start: int, end: int, dict_path: dict) -> int:
    from collections import deque
    if start == end or n == 1:
        return 0
    if start > end:
        start, end = end, start
    distation = [None] * (n + 1)
    queq = deque([start])
    distation[start] = 0
    while queq:
        x_point = queq.popleft()
        for i in dict_path[x_point]:
            if not distation[i]:
                distation[i] = distation[x_point] + 1
                queq.append(i)
    return distation[end] if distation[end] is not None else 1


n = int(input())
dict_path = {i: set() for i in range(1, n + 1)}
for i in range(1, n + 1):
    str_user = input().split()
    for num, j in enumerate(str_user, 1):
        if j == '1':
            dict_path[i].add(num)
            dict_path[num].add(i)
start, end = map(int, input().split())
print(search_width(n, start, end, dict_path))

Проблема

Основную часть тестов проходит, на 17 тесте выдаёт неправильный ответ.

Предположение: есть особый случай, к которому нужно добавить условие.

Ошибка в моём алгоритме или я не дописал случай?

Ответы

▲ 3Принят

Вцелом 2 проблемы в коде:

  1. Если начало и конец совпадают, надо возвращать 0
  2. Если путь не существует, то возвращаем -1 (минус один)

Также, как оптимизации:

  1. Вам не нужно считать расстояния до всех вершин, можно только до вершины end
  2. Вам не надо считать все пути до конца, как только встретили вершину end - можно прекращать поиск.