Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 14.06.2020
Сообщений: 7
1

Задача "Pink Floyd"

17.11.2020, 22:09. Показов 4240. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток! Есть такая задача.
Группа Pink Floyd собирается дать новый концертный тур по всему миру. По предыдущему опыту группа знает, что солист Роджер Уотерс постоянно нервничает при перелетах. На некоторых маршрутах он теряет вес от волнения, а на других - много ест и набирает вес.
Известно, что чем больше весит Роджер, тем лучше выступает группа, поэтому требуется спланировать перелеты так, чтобы вес Роджера на каждом концерте был максимально возможным. Группа должна посещать города в том же порядке, в котором она дает концерты. При этом между концертами группа может посещать промежуточные города.
Входные данные
Первая строка входного файла содержит три натуральных числа n, m и k - количество городов в мире, количество рейсов и количество концертов, которые должна дать группа соответственно (n≤100, m≤10^4, 2≤k≤10^4). Города пронумерованы числами от 1 до n. Следующие m строк содержат описание рейсов, по одному на строке. Рейс номер i описывается тремя числами bi, ei и wi - номер начального и конечного города рейса и предполагаемое изменение веса Роджера в миллиграммах (1≤bi,ei≤n, −10^5≤wi≤10^5). Последняя строка содержит числа a1, a2, ..., ak - номера городов, в которых проводятся концерты. В начале концертного тура группа находится в городе a1.Гарантируется, что группа может дать все концерты.
Выходные данные
Первая строка выходного файла должна содержать число s - количество рейсов, которые должна сделать группа. Вторая строка должна содержать s чисел - номера используемых рейсов. Если существует такая последовательность маршрутов между концертами, что Роджер будет набирать вес неограниченно, то первая строка выходного файла должна содержать строку “infinitely kind”.
Примеры
входные данные
4 8 5
1 2 -2
2 3 3
3 4 -5
4 1 3
1 3 2
3 1 -2
3 2 -3
2 4 -10
1 3 1 2 4
выходные данные
6
5 6 5 7 2 3
входные данные
4 8 5
1 2 -2
2 3 3
3 4 -5
4 1 3
1 3 2
3 1 -2
3 2 -3
2 4 10
1 3 1 2 4
выходные данные
infinitely kind
Вот мой код к этой программе
Кликните здесь для просмотра всего текста
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int ret(vector<vector<int>>& from, int u, int v, vector<int>& path)
{
    if (u == v)
    {
        return 0;
    }
    if (from[u][v] == u || from[u][v] == v)
    {
        path.push_back(v);
        return 0;
    }
    ret(from, u, from[u][v], path);
    ret(from, from[u][v], v, path);
    return 0;
}
int main()
{
    const int inf = -1e9;
    bool cycle = false;
    int n, m, k;
    cin >> n >> m >> k;
    vector<vector<int>> graph(n, vector<int>(n, inf)), from(n, vector<int>(n, -1));
    vector<int> a(k + 1, 0), path, ans;
    map<pair<int, int>, int> flights;
    path.push_back(0);
    for (int i = 0; i < m; i++)
    {
        int b, e, w;
        cin >> b >> e >> w;
        b--, e--;
        graph[b][e] = w;
        flights[{b, e}] = i;
        from[b][e] = b;
    }
    for (int i = 1; i <= k; i++)
    {
        cin >> a[i];
        a[i]--;
    }
    for (int i = 0; i < n; i++)
    {
        graph[i][i] = 0;
    }
    for (int K = 0; K < n; K++)
    {
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (graph[i][j] < graph[i][K] + graph[K][j])
                {
                    graph[i][j] = graph[i][K] + graph[K][j];
                    from[i][j] = K;
                }
            }
        }
    }
    for (int i = 0; i <= k; i++)
    {
        if (graph[a[i]][a[i]] > 0)
        {
            cycle = true;
        }
    }
    if (cycle)
    {
        cout << "infinitely kind";
    }
    else
    {
        for (int j = 1; j <= k; j++)
        {
            ret(from, a[j - 1], a[j], path);
        }
        for (int i = 1; i < path.size(); i++)
        {
            ans.push_back(flights[{path[i - 1], path[i]}] + 1);
        }
        cout << ans.size() << endl;
        for (auto el : ans)
        {
            cout << el << " ";
        }
    }
}

Но дело в том, что на информатиксе он проходит 11 тестов из 24. Помогите, пожалуйста, разобраться, где я допустил ошибку. Скорее всего, проблема таится где-то в функции
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2020, 22:09
Ответы с готовыми решениями:

Pink Floyd
Может кто подскажет, что стоит у них послушать еще... Мой любимый альбом Wish You Were Here (и еще...

Pink Floyd
Очень любил я группу Dream Theater. Начал концерты перслушивать, и наткнулся на каверы Queen и Pink...

Floyd Mayweather Jr
Всем привет, ни кто не в курсе, правда ли Floyd Mayweather ушёл из бокса... Просто перед наверно...

ria pc game - pink dreams come true
https://youtu.be/myd2TeYfxjw На дворе, за окном - по прежнему осень, а значит дождь, уныние и...

Олимпиадная задача по программированию. PascalABC.NET. Задача L. Переключение между окнами
Когда пользователь работает в операционной системе Winux, у него часто запущено несколько...

5
392 / 262 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
17.11.2020, 23:37 2
Не ясно в каком порядке можно посещать города, в каком нельзя... У нас всего n городов, надо посетить k выбранных. Хорошо. Посещать города можно по несколько раз? Если можно, это относится и к выбранным? Можно ли заехать в выбранный город и не давать концерт? Можно ли заехать в выбранный город, после того, как дали в нем концерт? Поясните эти вопросы, пожалуйста.
0
1 / 1 / 0
Регистрация: 14.06.2020
Сообщений: 7
18.11.2020, 19:45  [ТС] 3
Города, в которых надо дать концерт, нужно посетить в том порядке, в котором они вбиты
1) Можно посещать города по несколько раз. Это относится и к выбранным
2) Допустим, мы посетили А[j - 1] город и нам нужно теперь посетить город A[j], если мы туда попадаем, то концерт нужно будет провести
3) Можно заехать в выбранный город, после того как дали в нем концерт
0
392 / 262 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
18.11.2020, 20:10 4
Мне кажется стоит у всех ребер поменять знак. Чтобы отрицательные стали положительными и наоборот. Потом попробовать найти отрицательный цикл, например алгоритмом Беллмана-Форда. Это значит, что можно набирать вес бесконечно. (Кроме одного случая, когда мы до этого цикла не успеем дойти. Это возможно, если путь к этому циклу проходит только через города выбранные. Это потому что вы говорите, что :
Цитата Сообщение от _Linkor_ Посмотреть сообщение
если мы туда попадаем, то концерт нужно будет провести
. По этой причине мне кажется, что это неправда и концерт можно сразу не давать, иначе задача усложняется сразу лишним кодом.)

Потом запустить алгоритм Флойда-Уоршелла. После чего просто идти по массиву выбранных городов и прибавлять в сумму полученное алгоритмом расстояние между a[i] и a[i+1].

В конце стоит поменять знак у суммы и вывести всё. Ну, в вашем случае ещё ответ восстановить. (Соболезную).

Код двух алгоритмов сверху лучше просто скопировать с emaxx, чтобы не ошибиться.
0
1 / 1 / 0
Регистрация: 14.06.2020
Сообщений: 7
18.11.2020, 20:23  [ТС] 5
Я, возможно, вас неправильно понял, но зачем использовать алгоритм Форда-Беллмана, если алгоритмом Флойда тоже можно найти цикл? На диагонали матрицы смежности стоят не нули - признак цикла, если использовать алгоритм Флойда. Я проверял, все случаи с циклом моя программа обрабатывает корректно (писал программу, которая выводит только сообщение о цикле, и сверял тесты)
0
392 / 262 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
18.11.2020, 21:11 6
Цитата Сообщение от _Linkor_ Посмотреть сообщение
писал программу, которая выводит только сообщение о цикле, и сверял тесты)
Ну... Не очень разбираюсь в алгоритмах с графами, поверю вам на слово.

Посмотрел ваш код, вроде все логично выглядит. Если проблема не в кратных ребрах или петлях, то и не знаю.

Может кто другой что-нибудь увидит. Но здесь я вам не смогу помочь, извините.

Могу предложить только забить на задачу и решать другую)
1
18.11.2020, 21:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2020, 21:11
Помогаю со студенческими работами здесь

Васильев C# Глава 8 задача 2 (Просьба объяснить формулировку(задача внутри)
Текст задачи Написать программу , в которой есть класс с полем, являющимся ссылкой на одномерный...

Васильев C# Глава 7 задача 8 (Просьба объяснить формулировку(задача внутри)
Текст задачи Напишите программу с классом, у которого есть текстовое поле. Значение текстовому...

Задача со строками. Задача находится на фотке, которая прикреплена к сообщению
Фотку прикрепил к сообщению. П.5.4. Правил Запрещено создавать темы с бессмысленными названиями...

Задача при создание нового лида выводится задача от несущ.пользователя Б24
При создание нового Лида Выходит уведомление от пользователя которого нету в компаний. ...

Задача коммивояжера, TSP, задача на нахождение кратчайших путей
Здравствуйте, знаю что это наглость с моей стороны, но может кто то решал задачу коммивояжера и у...


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

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