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

Лабиринт знаний. Графы

10.04.2017, 15:43. Показов 8697. Ответов 18
Метки нет (Все метки)

В Летней Компьютерной Школе (ЛКШ) построили аттракцион «Лабиринт знаний». Лабиринт представляет собой n комнат, занумерованных от 1 до n, между некоторыми из которых есть двери. Когда человек проходит через дверь, показатель его знаний изменяется на определенную величину, фиксированную для данной двери. Вход в лабиринт находится в комнате 1, выход — в комнате n. Каждый ученик проходит лабиринт ровно один раз и попадает в ту или иную учебную группу в зависимости от количества набранных знаний (при входе в лабиринт этот показатель равен нулю). Ваша задача показать наилучший результат.

C++
1
2
3
4
Входные данные
2 2
1 2 5
1 2 -5
C++
1
2
Выходные данные
5
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2017, 15:43
Ответы с готовыми решениями:

Игра лабиринт. ИИ в лабиринте. Как задать лабиринт
У меня есть следующее задание: Дано: - робот - лабиринт Задание: - Нужно реализовать...

Лабиринт.
Добрый вечер, вот решил создать примитивный лабиринтик, создал, проблем не было, но тут пришла в...

Лабиринт
Может есть у кого нибудь на lisp готовый вариант лабиринта: поиск всех возможных путей или ...

Лабиринт
Нашёл прогу лабиринта, очень заинтересовался ей и хочу в ней детально разобраться, а исходного кода...

18
0 / 0 / 0
Регистрация: 12.11.2016
Сообщений: 28
29.01.2018, 20:20 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
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
90
91
92
93
94
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long  ll;
typedef unsigned long long ull;
typedef map <int, int> mii;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
 
int const maxn = int(1e5 + 12);
int const maxb = int(2e6 + 12);
int const inf = int(1e9 + 7);
ll const linf = ll(1e18 + 12);
double const eps = 1e-7;
double const pi = acos(-1);
#ifdef _WIN32
    #define I64 "%I64d"
#else
    #define I64 "%lld"
#endif
#define mp make_pair
#define pb push_back
#define F first
#define S second
#define next MyLittleNext
//#define end MyLittleEnd
#define all(x) x.begin(), x.end()
#define LOCAL
 
struct edge
{
    int a, b, c;
    edge(int a, int b, int c) : a(a), b(b), c(c) {};
};
 
int n, m;
vector <edge> e;
vector <int> g[maxn];
int us[maxn];
 
void dfs(int v)
{
    us[v] = 1;
    for (int i = 0; i < int(g[v].size()); i++)
    {
        int to = g[v][i];
        if (!us[to])
            dfs(to);
    }
}
 
int main()
{
    #ifdef LOCAL
        freopen("input.txt", "r", stdin);
        freopen("output.txt", "w", stdout);
    #endif
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; i++)
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        g[a].pb(b);
        e.pb(edge(a, b, -c));
    }
    vector <int> d(n + 1, inf);
    d[1] = 0;
    int x = -1;
    for (int i = 0; i < n; i++)
    {
        x = -1;
        for (int j = 0; j < m; j++)
            if (d[e[j].a] < inf && d[e[j].b] > d[e[j].a] + e[j].c)
            {
                d[e[j].b] = max(-inf, d[e[j].a] + e[j].c);
                x = e[j].b;
            }
        //printf("%d ", x);
    }
    if (x != -1)
        dfs(x);
    if (us[n])
    {
        puts(":)");
        return 0;
    }
    if (d[n] >= inf)
    {
        puts(":(");
        return 0;
    }
    printf("%d", -d[n]);
}
0
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 484
29.01.2018, 20:45 3
Ничего не понял, можно объяснить?

Как я понял, что не понял, нужно на каждую дверь на значить увеличение показателя знаний, и сумму при проходе через 1, 1 и 2, 1 и 2 и 3, 1 и 2 и 3 и 4, 1 и 2 и 3 и 4 и 5. Верно?
0
0 / 0 / 0
Регистрация: 12.11.2016
Сообщений: 28
02.02.2018, 20:52 4
Да))
0
3 / 2 / 1
Регистрация: 29.10.2020
Сообщений: 28
30.08.2021, 15:38 5
Если кто-то засылает это решение, не забудьте заменить вывод.
WA 22 тест. Зачем скидывать не рабочее решение?

Добавлено через 7 минут
Более эффективное решение как по памяти так и по времени, проходящее все тесты.
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
#include<bits/stdc++.h>
#define int long long
#define inf 1e10l
using namespace std;
 
 
struct edge { int u, v, c; };
vector<pair<int, int>> gp[2002];
vector<edge> g;
vector<int> d(2002, -inf), p(2002, -1), used(2002, 0), ban(2002, 0);
 
void bfs(int i, int c) {
    used[i] = c;
    for (auto& e : gp[i]) {
        if (!used[e.first]) bfs(e.first, c);
    }
}
 
int32_t main() {
    ifstream cin("input.txt");
    int n, m; cin >> n >> m;
 
    for (int i = 0; i < m; i++) {
        edge ins; cin >> ins.u >> ins.v >> ins.c;
        ins.u--; ins.v--;
        gp[ins.v].push_back(make_pair(ins.u, ins.c));
        g.push_back(ins);
    }
    d[0] = 0;
    for (int k = 0; k < n; k++) {
        for (auto& e : g) {
            if (d[e.u] > -inf && d[e.v] < d[e.u] + e.c) {
                d[e.v] = d[e.u] + e.c;
                p[e.v] = e.u;
            }
        }
    }
     
    if (d[n - 1] == -inf) {
        cout << ":(";
        return 0;
    }
    bfs(n - 1, 1);                  
 
    int u = 2002;
    while (u != -1) {
        u = -1;
        for (auto& e : g) {
            if (!ban[e.u] && !ban[e.v]) {
                if (d[e.u] > -inf && d[e.v] < d[e.u] + e.c) {
                    d[e.v] = d[e.u] + e.c;
                    p[e.v] = e.u;
                    u = e.u;
                }
            }
        }
        if (u == -1) continue;
        vector<int> cyc; 
        int y = u;
        for (int i = 0; i < n; i++) {
            y = p[y];
        }
        for (int cur = y; ; cur = p[cur]) {
            cyc.push_back(cur);
            if (cur == y && cyc.size() > 1)  break;
        }
        for (auto b : cyc) ban[b] = 1;
    }
 
    for (int i = 0; i < n; i++) {
        if (used[i] && ban[i]) {
            cout << ":)"; return 0;
        }
    }
    cout << d[n - 1];
    return 0;
}
0
фрилансер
4589 / 4134 / 895
Регистрация: 11.10.2019
Сообщений: 10,839
30.08.2021, 15:44 6
VyacheslavSqrt, а, вдруг, это тесты неправильные?

я бы такой кривой код не принял
0
3 / 2 / 1
Регистрация: 29.10.2020
Сообщений: 28
30.08.2021, 15:50 7
Тесты то рабочие))) 340 человек заслало эту задачу
На счет чьего кода вы написали, что он кривой?)
0
фрилансер
4589 / 4134 / 895
Регистрация: 11.10.2019
Сообщений: 10,839
30.08.2021, 15:57 8
Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
340 человек заслало эту задачу
340 чайников, скопипастивших текст - не показатель Даже не так. Чайник - это начинающий программист, а копипастеры просто копипастят, не задумываясь

Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
что он кривой
1)
Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
#include<bits/stdc++.h>
- всё без разбору заинклудим, ну а чо

2)
Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
#define int long long
дефайн для алиаса в 2021 году! Да ещё и с перезапутыванием встроенных типов - огонь!

3)
Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
#define inf 1e10l
почему именно это значение?

4)
Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
using namespace std;
линейкой по рукам

5)
Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
vector<pair<int, int>> gp[2002];
массив векторов, супер подборочка

дальше можно не смотреть

Добавлено через 1 минуту
а, ну да, форматирование тоже огонь
0
3 / 2 / 1
Регистрация: 29.10.2020
Сообщений: 28
30.08.2021, 16:15 9
1)Дядь, это олимпиадное программирование, тут код пишется на скорость, а не подключи 10 библиотек, докажи что ты умеешь.
2)А как быстро побороться с переполнением, за 2 секунды?
3)А зачем использовать простые числа для бесконечности, тут нету никаких делений и операций по модулю.
4)Видимо надо тоже писать std раз 30, докажи что на клавиатуре есть двоеточие.
5)А вот прикола с массивом векторов не понял, сорян.
0
2287 / 1801 / 582
Регистрация: 29.06.2020
Сообщений: 6,736
30.08.2021, 16:23 10

Не по теме:

Цитата Сообщение от Алексей1153 Посмотреть сообщение
я бы такой кривой код не принял
Согласен, один из минусов автоматической проверки знаний на лицо.
Второй, возможность "списать" и не спалится. Хотя правильно списать уже пол дела )

Плюсы, быстро, дешево, большой охват учащихся. ( но качество такого тестирования ... ).



Цитата Сообщение от mercuriy71 Посмотреть сообщение
В Летней Компьютерной Школе (ЛКШ)
0
фрилансер
4589 / 4134 / 895
Регистрация: 11.10.2019
Сообщений: 10,839
30.08.2021, 18:00 11
Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
тут код пишется на скорость
ээ, там чё, блох ловить учат? Я думал, это программирование, а не дезинсекция

Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
А как быстро побороться с переполнением
какая связь кривого дефайна с переполнением - не очень понял

Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
3)А зачем использовать простые числа для бесконечности
опять не понял связи бесконечности с кривым дефайном
Если нужно наибольшее значение типа, то есть std::limits<type>::max()

Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
надо тоже писать std раз 30
да. Это не ловля блох, а программирование, детка

Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
5)А вот прикола с массивом векторов не понял, сорян.
если есть возможность использовать вектор, зачем использовать глобальный массив?

SmallEvil, всяким сириусам и яндекслицеям то чего - они своё бабло гребут, плодят довольных нубов. Сами же потом и нахлебаются, когда к ним толпа таких повалит
0
3 / 2 / 1
Регистрация: 29.10.2020
Сообщений: 28
30.08.2021, 18:27 12
Расскажи пожалуйста, как мне запихнуть 10^13 в инт, не очень хорошо уменю просто.
Повторюсь, я вам 30 раз переменным тип изменять буду? Зачем если можно написать 1 строчку кода?
Наибольшее значение типа + наибольшее значение типа = переполнение.
Использование 1e10 вполне оправданно, т.к. их можно сложить еще 1e8 раз.
Последнее это чисто дело вкуса.
0
фрилансер
4589 / 4134 / 895
Регистрация: 11.10.2019
Сообщений: 10,839
30.08.2021, 18:43 13
Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
Расскажи пожалуйста, как мне запихнуть 10^13 в инт
зачем int, бери int64_t

Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
я вам 30 раз переменным тип изменять буду
алиасы нужно использовать
C++
1
using MyType=int64_t;
а с используемым в том коде дефайном легко на грабли наступить. И это не будет являться типом, ибо макрос

с переполнением нужно бороться "по месту", алгоритмом или специальным типом данных. А не абстрактной константой

Добавлено через 1 минуту
VyacheslavSqrt, и, да, переубеждать ни в чём не собираюсь, это тебе всё (и ещё многое другое) расскажут на первом же собеседовании на работу
0
3 / 2 / 1
Регистрация: 29.10.2020
Сообщений: 28
30.08.2021, 19:47 14
Мужик, я вот не понимаю, ты на рофле это все пишешь или по серьезке докапываешься до кода который больше никогда использоваться не будет. Зачем писать вот это все дерьмо из промышленного программирования, если надо не качественно а БЫСТРО. Если ты не можешь понять что добавление одной строчки в начале программы заменяет 100действий, то я тебе соболезную.......
0
фрилансер
4589 / 4134 / 895
Регистрация: 11.10.2019
Сообщений: 10,839
30.08.2021, 20:04 15
VyacheslavSqrt, соболезновать надо жертвам этих курсов. А у меня всё хорошо
0
2287 / 1801 / 582
Регистрация: 29.06.2020
Сообщений: 6,736
30.08.2021, 21:00 16
VyacheslavSqrt, приучаться нужно к хорошему и удобному.
Алиасы через using, или тот же typedef.
Встроенные типы не трогать вообще. #define использовать в крайних , обоснованных случаях.

using namespace std:
Вместо всего пространства имен, следует использовать только то, что нужно часто.
using std::cout; using std::cin; using std::endl; // если ввода/вывода много.
то что не часто, записывается через std::
Придерживаясь максимальной инкапсуляции.

Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
Мужик, я вот не понимаю, ты на рофле это все пишешь или по серьезке докапываешься до кода который больше никогда использоваться не будет.
Рано или поздно придется приучать себя к порядку в коде. Когда приучишься, поймешь зачем это нужно, уже больше так писать не сможешь. И займет это не намного больше времени.
Никто, тут, ни над кем, не смеется. Всех благ , юноша.

p.s. еще пришлось гуглить слово "рофле"
0
фрилансер
4589 / 4134 / 895
Регистрация: 11.10.2019
Сообщений: 10,839
30.08.2021, 21:04 17
Цитата Сообщение от SmallEvil Посмотреть сообщение
рофл
товарищ намекает, что я его разыгрываю Он же явно сообщает, что
Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
это все дерьмо из промышленного программирования
то есть, у него нет цели стать программистом. Есть цель
Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
не качественно а БЫСТРО
- наловить блох
0
2287 / 1801 / 582
Регистрация: 29.06.2020
Сообщений: 6,736
30.08.2021, 21:30 18
Цитата Сообщение от VyacheslavSqrt Посмотреть сообщение
5)А вот прикола с массивом векторов не понял, сорян.
vector<pair<int, int>> gp[2002];

C++
1
2
3
typedef std::pair<int, int> pair_int;       // псевдонимы типов делают код более читабельным
typedef std::vector< pair_int>  vec_of_pair;  // и более гибким для изменения.
std::vector<vec_of_pair> gp(2002, vec_of_pair()); // также желательно вынести литерал 2002 в константу
можно записать и одной строчкой )
C++
1
std::vector<std::vector< std::pair<int, int>>> gp(2002, std::vector< std::pair<int, int>>());
1
3 / 2 / 1
Регистрация: 29.10.2020
Сообщений: 28
30.08.2021, 23:29 19
Оооо какой класс, аж глаза радуются, спасибо.)))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2021, 23:29
Помогаю со студенческими работами здесь

Лабиринт C++
я написал код лабиринта на c++, с помощью чего можно найти кратчайший путь выхода из лабиринта?...

Лабиринт
Быть может есть у кого код примитивного лабиринта?) Заранее ооочень благодарен!!!)

Лабиринт
Всем привет, нужно написать программу которая генерирует лабиринт, можно с заданной размерностью...

лабиринт
Коридорами лабиринта разрешается двигаться только в направлениях, указанных стрелками. Человек...


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

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

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