Bellman-Ford算法中的堆栈溢出和分段错误11

时间:2019-08-24 07:38:59

标签: c++ segmentation-fault stack-overflow bellman-ford

我正在用C ++实现Bellman-Ford算法,以发现货币兑换问题中的负权重周期,当我放置一个测试用例时,它给出了

Segmentation Fault: 11

代码如下:

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
struct edge
{
    int vertex;
    double weight;
};
int mindist(int A[],bool B[],int n)
{
    int v=0;
    while(B[v]==true)
        v++;
    for(int i=v;i<n;i++)
    {
        if(B[i]==false)
            if(A[i]<A[v])
                v=i;
    }
    return v;
}
class Graph
{
public:
    vector<edge> adj;

    void add(int a,int b)
    {
        edge e;
        e.vertex=a;
        e.weight=b;
        adj.push_back(e);
    }
};
int main()
{
    int n,m,u,v,j,isCycle=0;
    double w;
    edge temp;
    cin>>n>>m;
    Graph* G=new Graph[n];
    for(int i=0;i<m;i++)
    {
        cin>>u>>v>>w;
        w=-log(w);
        G[u-1].add(v-1,w);
    }
    int* dist=new int[n];
    bool* done = new bool[n];
    for(int i=0;i<n;i++)
    {
        dist[i]= 10000;
        done[i]=false;
    }
    dist[0]=0;
    for(int i=0;i<n;i++)
    {
        j=mindist(dist,done,n);
        done[j]=true;
        for(int i=0;i<G[j].adj.size();i++)
        {
            temp=G[j].adj[i];
            if(dist[temp.vertex]>temp.weight+dist[j])
                dist[temp.vertex]=temp.weight+dist[j];
        }
    }
    for(int i=0;i<n;i++)
    {
            temp=G[i].adj[i];
            if(dist[temp.vertex]>temp.weight+dist[i])
            {
                isCycle=1;
                break;
            }
    }
    cout<<isCycle;
}

测试用例:(格式:-FirstVertex SecondVertex权重)

//请注意,以下是有向图

10 9
1 2 1
6 7 1
8 9 1
9 10 1
3 4 1
7 8 1
4 5 1
5 6 1
2 3 1

我已经使用动态分配初始化了堆上的所有静态数组,但是仍然遇到相同的错误。谁能告诉我我哪里出问题了?

2 个答案:

答案 0 :(得分:1)

考虑当B为真时会发生什么。

然后执行此循环:

while(B[v]==true)
    v++;

具有不确定的行为,您很可能最终以“ v”结尾。
然后,您将v返回此代码:

j=mindist(dist,done,n);
done[j]=true;
for(int i=0;i<G[j].adj.size();i++)

,它将在外层空间的某处书写并查看不存在的Graph

检查范围。

此外,在该部分的两个嵌套循环中都使用i似乎很麻烦。
即使您要使用它,也可以重命名其中之一,这样看起来就不会错。

答案 1 :(得分:0)

分段错误位于第70行,因此在G [i] .adj [i]中,adj [i]不存在。每个adj [i]的大小均为1。第57行的循环也是错误的,因为您也在嵌套循环中使用了i。