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

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

Задан ориентированный граф, в нём не может быть петель и кратных рёбер. Необходимо найти длину кратчайшего пути от заданной вершины first до заданной вершины last. Вершины имеют только положительные номера, не превышающие 3*10^5, количество рёбер не более 10^5. Длина ребра не более 10^9 и не менее -10^9.

Входные данные: на первой строке поочерёдно идут количество вершин, количество рёбер, вершина first и вершина last. Далее идут m строк, содержащих информацию о рёбрах - первая, вторая вершина и цена ребра.

Пример ввода:

5 6 1 5
1 2 2
1 3 0
3 2 -1
2 4 1
3 4 4
4 5 5

На выход идёт только длина кратчайшего пути.

Мой код:

#include<iostream>
#include<fstream>
#include<vector>
#define inf 9223372036854775807


struct Edge
{
    int start, fin, len;//начальная вершина, конечная вершина и цена ребра соответственно
};


int main()
{
    int n, m;
    ifstream fin("input.txt");
    //считываем кол-во вершин n, рёбер m, начальную вершину first и конечную last
    fin >> n;
    fin >> m;
    fin >> first;
    fin >> last;


    //создаём вектор кратчайших путей из вершины first в остальные
    vector<long long int> d(n, inf);
    d[first - 1] = 0;


    //вектор смежных вершин
    vector<Edge> edges(m);
    for (int i = 0; i < m; i++)
    {
        fin >> edges[i].start >> edges[i].fin >> edges[i].len;
    }
    
    fin.close();

    //Беллман-Форд
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if ((d[edges[j].start - 1] + edges[j].len) < d[edges[j].fin - 1])
            {
                d[edges[j].fin - 1] = d[edges[j].start - 1] + edges[j].len;
            }
        }
    }
    //проверка на отрицательные циклы
    for (int j = 0; j < m; j++)
    {
        if ((d[edges[j].start - 1] + edges[j].len) < d[edges[j].fin - 1])
        {
            cout << "Negative cycle";
            return 0;
        }
    }
    cout << d[last - 1];
}

Мой код проходит большинство тестов в тестирующей системе. Однако на одном из них выдаёт ошибку WA (wrong answer). В чём ошибка не понимаю.


Ответы (0 шт):