Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
1 / 1 / 0
Регистрация: 09.04.2023
Сообщений: 61

В неориентированном графе найти минимальный путь между двумя вершинами

27.05.2023, 17:24. Показов 6177. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уже задавал этот вопрос, но появилась новая проблема.

Условие:

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

Формат входных данных:

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

Формат выходных данных:

Выведите сначала L — длину кратчайшего пути (количество ребер, которые нужно пройти), а потом сам путь. Если путь имеет длину 0, то его выводить не нужно, достаточно вывести длину. Если пути между вершинами не существует, то требуется вывести одно число — «-1».

Проблема:

Я не понимаю при каком условии надо выводить "-1".

Мой код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import queue
n = int(input())
graph = [[] * n for i in range(n)]
for i in range(n):
    lst = list(map(int, input().split()))
    graph[i] = lst.copy()
prev = [-1] * n
def bfs(s):
    q = queue.Queue()
    dist = [-1] * n
    dist[s] = 0
    q.put(s)
    while not(q.empty()):
        v = q.get()
        for u in range(n):
            if graph[v][u] == 1:
                if dist[u] == -1:
                    q.put(u)
                    global prev
                    dist[u] = dist[v] + 1
                    prev[u] = v
    return dist
a, b = map(int, input().split())
a -= 1
b -= 1
dist = bfs(a)
ans = []
i = b
while i != -1:
    ans.append(i + 1)
    i = prev[i]
ans.reverse()
if dist[b]== 0:
    print(dist[b])
else:
    print(dist[b])
    print(*ans)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.05.2023, 17:24
Ответы с готовыми решениями:

Минимальный путь между двумя вершинами
В неориентированном графе требуется найти минимальный путь между двумя вершинами. Формат входных данных Первым на вход поступает...

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

В неориентированном графе найти минимальный путь между двумя вершинами
Почему-то решение не проходит 1 тест. Условие В неориентированном графе требуется найти минимальный путь между двумя вершинами. ...

6
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38200 / 21132 / 4310
Регистрация: 12.02.2012
Сообщений: 34,739
Записей в блоге: 14
27.05.2023, 17:38
Цитата Сообщение от Woubat Посмотреть сообщение
Я не понимаю при каком условии надо выводить "-1".
- когда пути нет...
0
1 / 1 / 0
Регистрация: 09.04.2023
Сообщений: 61
27.05.2023, 17:38  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
когда пути нет...
Я это понимаю, просто как это проверить? А то я тупой немножко.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
27.05.2023, 18:09
Лучший ответ Сообщение было отмечено Woubat как решение

Решение

33 строка:
Python
1
if dist[b] <= 0:
0
1 / 1 / 0
Регистрация: 09.04.2023
Сообщений: 61
27.05.2023, 18:11  [ТС]
Цитата Сообщение от eaa Посмотреть сообщение
33 строка:
не поверишь - поменял, 18 тест прошел, 19 опять PE выдал

Добавлено через 15 секунд
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import queue
n = int(input())
graph = [[] * n for i in range(n)]
for i in range(n):
    lst = list(map(int, input().split()))
    graph[i] = lst.copy()
prev = [-1] * n
def bfs(s):
    q = queue.Queue()
    dist = [-1] * n
    dist[s] = 0
    q.put(s)
    while not(q.empty()):
        v = q.get()
        for u in range(n):
            if graph[v][u] == 1:
                if dist[u] == -1:
                    q.put(u)
                    global prev
                    dist[u] = dist[v] + 1
                    prev[u] = v
    return dist
a, b = map(int, input().split())
a -= 1
b -= 1
dist = bfs(a)
ans = []
i = b
while i != -1:
    ans.append(i + 1)
    i = prev[i]
ans.reverse()
if dist[b]== 0:
    print(dist[b])
if dist[b] <= 0:
    print(-1)
else:
    print(dist[b])
    print(*ans)
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
27.05.2023, 18:17
Лучший ответ Сообщение было отмечено Woubat как решение

Решение

Woubat, поменяй как я написал.

Добавлено через 1 минуту
Цитата Сообщение от Woubat Посмотреть сообщение
if dist[b]== 0:
    print(dist[b])
if dist[b] <= 0:
    print(-1)
эта конструкция выполнится 2 раза.
0
1 / 1 / 0
Регистрация: 09.04.2023
Сообщений: 61
27.05.2023, 18:20  [ТС]
Цитата Сообщение от eaa Посмотреть сообщение
эта конструкция выполнится 2 раза.
я вместо if написал elif и все заработало. Спасибо!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.05.2023, 18:20
Помогаю со студенческими работами здесь

В неориентированном графе найти минимальный путь между двумя вершинами
В неориентированном графе требуется найти минимальный путь между двумя вершинами. Входные данные Первым на вход поступает число N –...

В неориентированном графе требуется найти минимальный путь между двумя вершинами
Путь В неориентированном графе требуется найти минимальный путь между двумя вершинами. Входные данные Во входном...

найти и вывести путь в неориентированном графе между двумя вершинами
Методом поиска в ширину найти и вывести путь в неориентированном графе между двумя вершинами. Номера начальной и конечной вершины ввести...

Методом поиска в ширину найти и вывести путь в неориентированном графе между двумя вершинами
Методом поиска в ширину найти и вывести путь в неориентированном графе между двумя вершинами. Номера начальной и конечной вершины ввести с...

В неориентированном графе требуется найти длину минимального пути между двумя вершинами и сам путь с использованием bfs
Самое главное условие использовать bfs. В неориентированном графе требуется найти длину минимального пути и сам путь между двумя вершинами....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru