我已经编写了以下代码,但它有一些错误。它显示没有编译器错误,但我得到运行失败。我无法弄清楚逻辑出错的地方。
代码用于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分配空间这是不正确的错误或正确?如果这是正确的,那么可以检查基于我在无效最短路径中使用的循环的范围(我用注释标记它),可能在该循环中出现了问题? 有人可以帮帮我吗?我被卡住了。
答案 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;