Алгоритм Форда-Беллмана работает некорректно на некоторых тестах. Не могу понять в чём ошибка
уже очень долго сижу и не могу понять, где ошибка в моей реализации алгоритма Беллмана-Форда.
Задан ориентированный граф, в нём не может быть петель и кратных рёбер. Необходимо найти длину кратчайшего пути от заданной вершины 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). В чём ошибка не понимаю.