迭代对列表的向量给出错误

时间:2018-02-10 13:30:52

标签: c++11 dijkstra

我已经编写了以下代码,但它有一些错误。它显示没有编译器错误,但我得到运行失败。我无法弄清楚逻辑出错的地方。

代码用于dijkstras算法,以找到每个顶点的最短路径。

#include <bits/stdc++.h>

using namespace std;
# define inf 0x3f3f3f3f
typedef pair<int,int> ipair;

class graph
{
    int v;
    vector<list<pair<int,int>>> adj; 
public:
    graph(int v);
    void addedge(int w,int u,int v);
    void shortestpath(int src);
};

graph::graph(int v)
{
    this->v=v;
}

void graph::addedge(int u,int v,int w)
{
    adj[u].push_back(make_pair(v,w));
    adj[v].push_back(make_pair(u,w));
}

void graph::shortestpath(int src)
{
    priority_queue<ipair,vector<ipair>,greater<ipair>> pq; 

    vector<int> dist(v,inf);
    pq.push(make_pair(0,src));
    dist[src]=0;

    while(!pq.empty())
    {
        int m=pq.top().second;
        pq.pop();

        for(pair<int,int>& i:adj[m]) //check this ranged based for loop
        {          

                int p=i.first;
                int pwt=i.second;

                if(dist[p]>dist[m]+pwt)
                {
                dist[p]=dist[m]+pwt;
                pq.push(make_pair(dist[p],p));
                }

        }
    }
    for(int i=0;i<v;++i)
        cout << i << " " << dist[i];

}

int main()
{    
    graph g1(9);
    g1.addedge(0,1,4);
    g1.addedge(0,7,8);
    g1.addedge(1,2,8);
    g1.addedge(1,7,11);
    g1.addedge(2,3,7);
    g1.addedge(2,8,2);
    g1.addedge(2,5,4);
    g1.addedge(3,4,9);
    g1.addedge(3,5,14);
    g1.addedge(4,5,10);
    g1.addedge(5,6,2);
    g1.addedge(6,7,1);
    g1.addedge(6,8,6);
    g1.addedge(7,8,7);
    g1.shortestpath(0);

    return 0;
}

我认为逻辑错误的地方: 如你所见,我想创建一个矢量&gt; adj,而不是为adj.so分配空间这是不正确的错误或正确?如果这是正确的,那么可以检查基于我在无效最短路径中使用的循环的范围(我用注释标记它),可能在该循环中出现了问题? 有人可以帮帮我吗?我被卡住了。

1 个答案:

答案 0 :(得分:0)

致电时

adj[u].push_back(make_pair(v,w));
graph::addedge元素adj[u]中的

不存在,程序崩溃。你有未定义的行为读取矢量超出范围的元素。 您应该在v的构造函数中创建此向量的graph个元素。

graph::graph(int v)
{
    this->v=v;
    adj.resize(v);   // <---
}

算法看起来很好,结果是正确的,但打印输出是不可读的。您应该在for循环中添加endl以获得更可读的结果。

for(int i=0;i<v;++i)
    cout << i << " " << dist[i] << endl;