Курсовая работа: Поиск кратчайших путей в графе методом динамического программирования

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

4. Алгоритм Беллмана-Форда [Электронный ресурс] режим доступа URL: https://habr.com/ru/companies/otus/articles/484382/ (дата обращения: 20.04.2023)

5. Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ. / М.: Издательский дом «Вильямс», 2011.-- 1296 с. (дата обращения: 30.04.2023)

Приложение А

Приложение Б

from typing import List, Tuple, Union, Any

def get_adjacency_matrix():

    n = int(input("Введите количество вершин в графе: "))

    adj_matrix = []

    for i in range(n):

        row = list(map(int, input(f"Введите значения для вершины {i + 1}: ").split()))

        adj_matrix.append(row)

    edges = []

    for i in range(n):

        for j in range(n):

            if adj_matrix[i][j] != 0:

                edge = f"{i + 1}, {j + 1}, {adj_matrix[i][j]}"

                edges.append(edge)

    return edges

def bellman_ford_algorithm(edges: List[str], start_node: int, end_node: int) -> Union[

    tuple[list[Any], list[Any]], tuple[list[int], list[float]]]:

    inf = float("inf")

    n = len(edges)

    dist = [inf] * n

    prev = [-1] * n

    dist[start_node - 1] = 0

    for i in range(n - 1):

        for j in range(n):

            u, v, w = map(int, edges[j].split(","))

            if dist[u - 1] + w < dist[v - 1]:

                dist[v - 1] = dist[u - 1] + w

                prev[v - 1] = u - 1

    for i in range(n - 1):

        for j in range(n):

            u, v, w = map(int, edges[j].split(","))

            if dist[u - 1] + w < dist[v - 1]:

                return [], []

    path = []

    node = end_node - 1

    while node != -1:

        path.append(node + 1)

        node = prev[node]

    return list(reversed(path)), [dist[end_node-1]]

def print_result(path: List[int], dist: List[int]):

    if not path and not dist:

        print("В графе есть отрицательный цикл.")

    elif not path:

        print("Невозможно найти путь между заданными вершинами.")

    else:

        print(f"Длина кратчайшего пути: {dist[-1]}")

        print(f"Кратчайший путь: {' -> '.join(str(node) for node in path)}")

Источник: https://otherreferats.allbest.ru/download/1460514/