2 / 2 / 0
Регистрация: 27.02.2022
Сообщений: 18
1

Авиаперелеты. Алгоритм Форда Беллмана

23.12.2022, 22:56. Показов 3318. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Профессору Форду необходимо попасть на международную конференцию. Он хочет потратить на дорогу наименьшее количество денег, поэтому решил, что будет путешествовать исключительно ночными авиарейсами (чтобы не тратиться на ночевку в отелях), а днем будет осматривать достопримечательности тех городов, через которые он будет проезжать транзитом. Он внимательно изучил расписание авиаперелетов и составил набор подходящих авиарейсов, выяснив, что перелеты на выбранных направлениях совершаются каждую ночь и за одну ночь он не сможет совершить два перелета.

Теперь профессор хочет найти путь наименьшей стоимости, учитывая что до конференции осталось K ночей (то есть профессор может совершить не более K перелетов).

Входные данные
В первой строке находятся числа N (количество городов), M (количество авиарейсов), K (количество оставшихся ночей), S (номер города, в котором живет профессор), F (номер города, в котором проводится конференция).

Ограничения: 2≤N≤100, 1≤M≤105, 1≤K≤100, 1≤S≤N, 1≤F≤N.

Далее идет M строк, задающих расписание авиарейсов. i-я строка содержит три натуральных числа: Si, Fi и Pi, где Si - номер города, из которого вылетает i-й рейс, Fi - номер го-рода, в который прилетает i-й рейс, Pi - стоимость перелета i-м рейсом. 1≤Si≤N, 1≤Fi≤N, 1≤Pi≤106.

Выходные данные
Выведите одно число - минимальную стоимость пути, подходящего для профессора. Если профессор не сможет за K ночей добраться до конференции, выведите число -1.

Примеры
входные данные
4 5 2 1 4
1 2 1
2 3 1
3 4 1
1 3 3
1 4 5
выходные данные
4

У меня есть проблема, мой код не правильно считает кол-ва ночей, затраченных на перелеты в сумме, и => неправильный ответ. Помогите пожалуйста найти ошибку)

C++
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <vector>
#include <climits>
 
#define INF INT_MAX
 
struct Flight{
    int first, second, cost;
};
 
int num_of_cities, num_of_flights, max_nights, start, finish;
std::vector<Flight> e;
 
void FordBellman() {
    std::vector<int> dist(num_of_cities, INF);
    dist[start - 1] = 0;
    int nights;
    for (;;) {
        nights = 0;
        bool was_relaxed = false;
        for (int i = 0; i < num_of_flights; ++i) {
            if (e[i].first != INF) {
                if (dist[e[i].second] > dist[e[i].first] + e[i].cost) {
                    dist[e[i].second] = dist[e[i].first] + e[i].cost;
                    was_relaxed = true;
                    ++nights;
                }
            }
        }
        if (!was_relaxed) {
            break;
        }
    }
 
    if (nights <= max_nights) {
        std::cout << dist[finish - 1];
    }
    else {
        std::cout << -1;
    }
}
 
int main() {
    std::cin >> num_of_cities >> num_of_flights >> max_nights >> start >> finish;
    Flight t{};
    for (int i = 0; i < num_of_flights; ++i) {
        std::cin >> t.first >> t.second >> t.cost;
        --t.first, --t.second;
 
        e.push_back(t);
    }
 
    FordBellman();
 
    std::cout << std::endl;
    return 0;
}
Если что, ссылка на задачу: https://informatics.msk.ru/mod... rid=1995#1
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2022, 22:56
Ответы с готовыми решениями:

Алгоритм Форда-Беллмана
Доброго времени суток. Есть кривой код: #include &lt;iostream&gt; #include &lt;vector&gt; using namespace...

Алгоритм Форда - Беллмана
Помогите пожалуйста понять что не так у меня. ограничение времени на тест: 1 сек. ограничение...

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

Алгоритм Беллмана-Форда
Здравствуйте всем. Я вообще редко обращаюсь сюда за помощью решить задачу и стыдно как то, но я не...

1
2 / 2 / 0
Регистрация: 27.02.2022
Сообщений: 18
25.12.2022, 22:12  [ТС] 2
Все, проблема решена!

Вот код, если кому-то нужно:

C++
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <vector>
#include <tuple>
#include <climits>
 
#define INF INT_MAX
 
int main() {
    int num_of_cities, num_of_flights, max_nights, start, finish;
    std::cin >> num_of_cities >> num_of_flights >> max_nights >> start >> finish;
    std::vector<std::tuple<int, int, int>> all_flights;
    for (int i = 0; i < num_of_flights; ++i) {
        int first, second, cost;
        std::cin >> first >> second >> cost;
        all_flights.emplace_back(first - 1, second - 1, cost);
    }
 
    std::vector<std::vector<int>> dist(max_nights + 1);
    for (int night = 0; night < max_nights + 1; ++night) {
        for (int city = 0; city < num_of_cities; ++city) {
            if (night == 0 && city == start - 1) {
                dist[night].push_back(0);
            }
            else {
                dist[night].push_back(INF);
            }
        }
    }
 
    for (;;) {
        bool was_relaxed = false;
        for (int night = 1; night < max_nights + 1; ++night) {
            for (auto & flight : all_flights) {
                int u, v, w;
                std::tie(u, v, w) = flight;
                if (dist[night - 1][u] != INF) {
                    if (dist[night][v] > dist[night - 1][u] + w) {
                        dist[night][v] = dist[night - 1][u] + w;
                        was_relaxed = true;
                    }
                }
            }
        }
        if (!was_relaxed) {
            break;
        }
    }
 
    int min_cost = INF;
    for (int night = 0; night <= max_nights; night++) {
        if (dist[night][finish - 1] < min_cost) {
            min_cost = dist[night][finish - 1];
        }
    }
 
    if (min_cost == INF) {
        std::cout << -1;
    }
    else {
        std::cout << min_cost;
    }
    std::cout << std::endl;
    return 0;
}
0
25.12.2022, 22:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.12.2022, 22:12
Помогаю со студенческими работами здесь

Алгоритм Форда-Беллмана
Народ если есть у кого нибудь исходник выложите пожалуйста очень надо. А то везде одно и то же......

Как реализовать Алгоритм Беллмана-Форда со смежной матрицей?
Ребят,есть код и его нужно реализовать со смежными графами. Помогите!!!) #include &quot;pch.h&quot; ...

Матрица Форда Беллмана и метод Дейкстра
Тут такая проблема , задали написать матрицу с помощью єтих методов/ вопрос : Как вставить сюда...

Восстановление пути из алгоритма Форда-Беллмана
Реализовал алгоритм Форда-Беллмана, но не получается правильно восстановить пути, подскажите, где...

Графы: реализация алгоритма Беллмана-Форда
Написать программу, реализующую алгоритм Беллмана-Форда.

Реализация алгоритма Беллмана-Форда, с использование класса
Добрый день. Как в графе, реализовать алгоритм Беллмана-Форда,с использование класса на C++....


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru