Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 贝尔曼·福特的实施不起作用_C++_Algorithm_Bellman Ford - Fatal编程技术网

C++ 贝尔曼·福特的实施不起作用

C++ 贝尔曼·福特的实施不起作用,c++,algorithm,bellman-ford,C++,Algorithm,Bellman Ford,我试着写贝尔曼-福特算法,我发现它不起作用。问题是,我和我问过的任何人都找不到错误,我想这一定很简单。一开始它似乎是正确的,因为对于我使用的每一个例子,它都很有效,但对于一些更大的例子,它却没有。代码是: #include <iostream> using namespace std; long long tab[3001][3001]; long long t[3001]; int main () { int v,e; cin >> v >> e; //

我试着写贝尔曼-福特算法,我发现它不起作用。问题是,我和我问过的任何人都找不到错误,我想这一定很简单。一开始它似乎是正确的,因为对于我使用的每一个例子,它都很有效,但对于一些更大的例子,它却没有。代码是:

#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++)
贝尔曼福特可能需要最多v-1放松,而不是e-1放松


假设e等于1,即有1条边。您的程序将不会检测到使用该边的路由,因为该for循环将永远不会进入车身。

请详细说明它是如何工作的。“不工作”在试图解决某些问题时毫无用处贝尔曼·福特工作得很好。“是你对贝尔曼·福特的实施不起作用了。”米克纳基斯·阿尔赫取消了投票,因为我想投两次票。这可能会被认为是吹毛求疵,但区分一个坏的算法和一个坏的实现是非常重要的。失败的案例有可能有3000多个顶点吗?或者总距离超过你的20…0常数?好的,很好的一点,它应该是i=0,但我不认为它应该是v;我的意思是,虽然它只有一条边,但只需要一次迭代就可以找到answers@Junak只要打开下一本算法书,看看贝尔曼-福特算法。它使用N-1次迭代来松弛边,其中N是顶点数。最大松弛次数应等于最长路径的长度。如果路径使用所有v顶点,则最大长度为v-1。如果路径使用所有e边,则其最大长度也为e。所以你可以选择迭代我的,v-1次,如果你想的话。通常e>v,所以大多数实现只使用v-1。