我试着编写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 :(得分:1)
这一行存在一个问题:
for (long long i=1;i<e;i++)
贝尔曼 - 福特可能需要达到v-1的放松,而不是e-1。
假设e等于1,即你有1个边。您的程序将不会检测使用该边缘的路径,因为此for循环将永远不会进入正文。