Алгоритм Дейкстры за O(M log N) | Реализация на C++

Sdílet
Vložit
  • čas přidán 1. 07. 2019
  • Алгоритм Дейкстры позволяет находить кратчайшие пути от заданной вершины до всех остальных вершин. В данном видео мы реализуем алгоритм Дейкстры за O(M log N), где N - количество вершин, M - количество ребер.
    Код: github.com/shelengovskaya/alg...

Komentáře • 24

  • @it.alchemist
    @it.alchemist  Před 4 lety +7

    const int Inf = 30000

  • @alexanderbozhnyukrs1469
    @alexanderbozhnyukrs1469 Před 2 lety +7

    Не знаю, прочитаешь ли ты комментарий, но я благодаря тебе понял все, что связано с этим алгоритмом. Спасибо большое и надеюсь, что у тебя все отлично!

  • @mishelseashell
    @mishelseashell Před rokem +1

    Спасибо тебе огромное :)
    Долго искала понятный урок про Дейкстру именно с приоритетной очередью и наконец-то нашла

  • @MartinIden-hn7ld
    @MartinIden-hn7ld Před 2 měsíci

    Спасибо за видео
    Как и было сказано ранее, в самой матрице неверно рассчитано значение
    "Из 3й вершины в 1ю за 2 еденицы веса, у вас 1 в таблице смежности"
    Вот код без ручного ввода и использующий очередь с приоритетом с компаратором (не нужно будет исп-ть минус)
    const int INF = 100000;
    int main() {
    // Входные данные, сам граф, начальная и конечные точки
    vectorgraf = {
    {0, 1, 1},
    {4, 0 , 1},
    {2, 1, 0}
    };
    int start = 2;
    int end = 1;
    start--;
    end--;
    // Вектор для расстояний, инициализация начальной вершины, очередь из пар, пуш стартового эл-та в очередь
    vectordist(graf.size(), INF);
    dist[start] = 0;
    priority_queueq;
    q.push(make_pair(0, start));
    while (!q.empty()) {
    int length = q.top().first;
    int v = q.top().second;
    q.pop();
    if (length > dist[v]) continue;
    for (int i = 0; i < graf.size(); i++) {
    int to = i;
    int len = graf[v][i];
    if (dist[to] > dist[v] + len and len >= 0) {
    dist[to] = dist[v] + len;
    q.push(make_pair(dist[to], to));
    }
    }
    }
    cout

  • @user-vh9ux6of8u
    @user-vh9ux6of8u Před rokem

    Огромное спасибо за объяснение, искал очень долго реализацию с очередью этой, наконец-то, спустя столько времени, я нашёл её

  • @dreamteamsolo
    @dreamteamsolo Před 3 lety

    Здравствуйте ,можете объяснить почему сложность данного алгоритма именно MlogN,logN в приоритетной очереди получается ,а где ещё проход на M

  • @funnyicecream8276
    @funnyicecream8276 Před 4 lety

    подскажите как надо изменить программу, чтобы вектор заполнять матрицей весов из файла?

  • @diibirovzzz5470
    @diibirovzzz5470 Před 4 lety +2

    Спасибо большое, а можно и флойда?

  • @user-ej4ql8pz9x
    @user-ej4ql8pz9x Před 4 lety +13

    Из 3й вершины в 1ю за 2 еденицы веса, у вас 1 в таблице смежности

    • @user-vd8kt4td7i
      @user-vd8kt4td7i Před 11 měsíci

      Скорей всего ошиблась, человеческий фактор

  • @user-iv1ps8mf3v
    @user-iv1ps8mf3v Před rokem

    А если узлы не все со всеми ?

  • @user-jp1jy7xm6z
    @user-jp1jy7xm6z Před 2 lety +2

    Очень долго, гораздо быстрее было бы, если бы вы складывали все посещенные вершины в какой-нибудь хэш-сет и каждый раз его проверяли.

  • @user-ny4qy5qk1n
    @user-ny4qy5qk1n Před 4 lety

    А как сделать, чтобы выводилось расстояние от заданной вершины до всех оставшихся?

    • @XOR1344
      @XOR1344 Před 2 lety +1

      Просто проходишся від 1 до н і виводиш d[i]

  • @user-fn6qe1wy6f
    @user-fn6qe1wy6f Před 4 lety +1

    Если ты ты это читаешь, то знай, что видео топовое. Зря забросила

  • @dol_6a_eb
    @dol_6a_eb Před 6 měsíci

    Женись на мне

  • @bogdanshelomanov5668
    @bogdanshelomanov5668 Před 4 lety

    Очень плохо сделано, сделай себе граф, у которого 10к вершин, твой алгоритм пройдет все вершины, даже если путь нужен от 1 до 4, но все вершины не нужно смотреть, зачем

    • @it.alchemist
      @it.alchemist  Před 4 lety +5

      Bogdan Shelomanov, если ты не просмотришь все вершины, то просто можешь не найти кратчайший путь, а именно эту задачу мы и хотим решить. e-maxx.ru/algo/dijkstra_sparse

    • @bogdanshelomanov5668
      @bogdanshelomanov5668 Před 4 lety

      @@it.alchemist можешь, достаточно посмотреть, что эта вершина является минимальной и немзменной

    • @bogdanshelomanov5668
      @bogdanshelomanov5668 Před 4 lety +1

      @@it.alchemist если она минимальна, меньше она быть не может, посмотри как люди на бумаге делают, каждая итерация по новой вершине добавляет какую-то в наименьшую, наименьшая - это вершина, путь до которой самый минимальный среди посещенных вершин, исключая уже наименьшие до этого

    • @bogdanshelomanov5668
      @bogdanshelomanov5668 Před 4 lety

      @@it.alchemist czcams.com/video/tyQSgTytc4s/video.html
      Тут мужик вот показал как раз

    • @it.alchemist
      @it.alchemist  Před 4 lety +6

      Bogdan Shelomanov у меня точно такой же алгоритм, только я ищу минимум с помощью приоритетной очереди, поэтому сложность не O(N^2 + M), а O(MlogN)!