Bellman Ford实施不起作用

Bellman ford implementation does not work

本文关键字:不起作用 Ford Bellman      更新时间:2023-10-16

我试图编写Bellman-Ford算法,并且发现它不起作用。问题是,我(和我问过的任何人(都找不到错误,我认为这一定很简单。起初看起来是正确的,对于我使用它的每个示例,cos都很好,但对于一些较大的示例而言,cos却没有。代码是:

#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。

一个问题是:

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

Bellman Ford最多需要V-1放松,而不是E-1。

假设E等于1,即您具有1个边缘。您程序将无法检测到使用该边缘的路线,因为循环永远不会进入身体。