迭代给出错误的对列表的向量
Iterating over vector of list of pairs giving errors
我写了下面的代码,但是里面有问题。它没有显示编译器错误,但我得到 运行 失败。我无法弄清楚逻辑哪里出了问题。
代码是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;
}
我认为逻辑错误的地方:
如您所见,我想创建一个向量> adj,而不是为 adj.so 分配 space,这是错误的还是正确的?如果这是正确的,那么可能会检查我在无效最短路径中使用的基于范围的 for 循环(我已经用注释标记了它),也许那个循环中有问题?
有人可以帮我吗?我卡住了。
当你打电话时
adj[u].push_back(make_pair(v,w));
in graph::addedge
元素 adj[u]
不存在,程序崩溃。你得到了超出范围的向量的未定义行为读取元素。
您应该在 graph
.
的构造函数中创建此向量的 v
个元素
graph::graph(int v)
{
this->v=v;
adj.resize(v); // <---
}
算法看起来不错,结果正确,但打印输出不可读。您应该在 for 循环中添加 endl 以获得更具可读性的结果。
for(int i=0;i<v;++i)
cout << i << " " << dist[i] << endl;
我写了下面的代码,但是里面有问题。它没有显示编译器错误,但我得到 运行 失败。我无法弄清楚逻辑哪里出了问题。
代码是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;
}
我认为逻辑错误的地方: 如您所见,我想创建一个向量> adj,而不是为 adj.so 分配 space,这是错误的还是正确的?如果这是正确的,那么可能会检查我在无效最短路径中使用的基于范围的 for 循环(我已经用注释标记了它),也许那个循环中有问题? 有人可以帮我吗?我卡住了。
当你打电话时
adj[u].push_back(make_pair(v,w));
in graph::addedge
元素 adj[u]
不存在,程序崩溃。你得到了超出范围的向量的未定义行为读取元素。
您应该在 graph
.
v
个元素
graph::graph(int v)
{
this->v=v;
adj.resize(v); // <---
}
算法看起来不错,结果正确,但打印输出不可读。您应该在 for 循环中添加 endl 以获得更具可读性的结果。
for(int i=0;i<v;++i)
cout << i << " " << dist[i] << endl;