Реализация Bellman Ford не работает

Я попытался написать алгоритм Беллмана-Форда, и я вижу, что он не работает. Проблема в том, что я (и все, кого я просил) не могу найти ошибку, я думаю, что это должно быть что-то очень простое. Поначалу это кажется правильным, потому что для каждого примера, который я использовал, он работает хорошо, а для некоторых более крупных — нет. Код является:

#include <iostream>
using namespace std;

long long tab[3001][3001];
long long t[3001];

int main ()
{
int v,e;
cin >> v >> e;
//number of vertices and edges
for (long long i=0;i<=v;i++)
{
for (long long j=0;j<=v;j++)
{
tab[i][j]=20000000000;
}
}
long long x,y,odl;
for (int i=0;i<e;i++)
{
//unordered vertices
cin >> x >> y >> odl;
tab[x][y]=odl;
tab[y][x]=odl;
}
for (long long i=1;i<=v;i++)
tab[i][i]=0;for (long long i=1;i<=v;i++)
t[i]=tab[1][i];

bool q;

for (long long i=1;i<e;i++)
{
q=false;
for (long long j=1;j<=v;j++)
{
for (long long k=1;k<=v;k++)
{
if (t[j]>t[k]+tab[k][j])
{
t[j]=t[k]+tab[k][j];
q=true;
}
}
}
//if there was no changes, break
if (!q)
break;
}
for (long long i=1;i<=v;i++)
{
if (t[i]==20000000000)
cout << -1<<endl;
else
cout << t[i]<<endl;

}
}

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

0

Решение

Одна проблема с этой строкой:

for (long long i=1;i<e;i++)

Беллману-Форду может понадобиться расслабление до v-1, а не e-1.

Предположим, что е равно 1, то есть у вас есть 1 ребро. Ваша программа не обнаружит маршрут, который использует этот край, потому что этот цикл for никогда не войдет в тело.

1

Другие решения

Других решений пока нет …