我正在尝试使用 c++ STL 制作 prims 算法。在迭代器第一次迭代后,它会停止代码并给出错误的输出
Posted
技术标签:
【中文标题】我正在尝试使用 c++ STL 制作 prims 算法。在迭代器第一次迭代后,它会停止代码并给出错误的输出【英文标题】:I am trying to make prims algorithm using c++ STL. After the iterator iterates 1st time it stops the code and gives wrong output 【发布时间】:2021-04-07 19:17:24 【问题描述】:首先我创建了一个顶点、边和权重的无向图。
在prims()
函数中:
0
索引之外的所有索引i < n
,vertex[]
数组初始化为INT_MAX
。它将具有迄今为止发现的最小权重。
bool isthere[]
数组检查是否访问了顶点。
list<int> s
最初将具有 5 (0-4 indices)
值。在每个 for 循环之后,它的值都会弹出。
vector<int> mset
将保留根据其最小权重选择的顶点。
#include<bits/stdc++.h>
using namespace std;
void addEdge(vector<pair<int,int>>adj[],int u,int v,int wt)
adj[u].push_back(make_pair(v,wt));
adj[v].push_back(make_pair(u,wt));
void print(vector<pair<int,int>>adj[],int v)
for(int i=0;i<v;++i)
cout<<i<<"-->";
vector<pair<int,int>>::iterator it;
for(it=adj[i].begin();it!=adj[i].end();++it)
cout<<it->first<<"-"<<it->second<<" ";
cout<<"\n";
void prims(vector<pair<int,int>>adj[],int v)
int vertex[v];
bool isthere[v];
vertex[0]=0;
isthere[0]=true;
list<int>s;
s.push_back(0);
for(int i=1;i<v;++i)
vertex[i]=INT_MAX;
isthere[i]=false;
s.push_back(i);
vector<int>mset;
int i=0;
while(!s.empty())
isthere[i]=true;
mset.push_back(i);
s.pop_back();
cout<<"i="<<i<<" ";
int lesser=INT_MAX;
vector<pair<int,int>>::iterator it;
for(it=adj[i].begin();it!=adj[i].end();++it)
cout<<"it-"<<it->first<<" "<<it->second<<"\n";
if(isthere[it->first]==false && vertex[it->first]>it->second)
if(lesser>it->second)
lesser=it->second;
i=it->first;
cout<<"i="<<i<<" ";
vertex[it->first]=it->second;
int main()
int v=5;
vector<pair<int,int>>adj[v];
addEdge(adj,0,1,2);
addEdge(adj,0,2,8);
addEdge(adj,1,3,21);
addEdge(adj,4,1,6);
addEdge(adj,2,1,0);
addEdge(adj,2,4,5);
addEdge(adj,3,4,9);
print(adj,v);
prims(adj,v);
return 0;
这是我的邻接列表。它是表示顶点、权重的对向量数组。
0-->1-2 2-8
1-->0-2 3-21 4-6 2-0
2-->0-8 1-0 4-5
3-->1-21 4-9
4-->1-6 2-5 3-9
这是调试输出和我在prims()
函数中遇到的错误。
i=0 it-1 2
i=1 it-2 8
it-0 0
it- -874898181 134251312
Process returned -1073741819 (0xC0000005) execution time : 0.835 s
Press any key to continue.
【问题讨论】:
使用std::vector<std::vector<int>>
作为您的邻接列表。使用运行时整数声明数组是 gcc 特有的
您在调试代码时看到了什么?
int vertex[v];
-- 这不是有效的 C++。您已经在使用std::vector
,所以问题是——您知道std::vector
的用途吗?它是做你现在拥有的非 C++ 代码应该做的事情。 std::vector<int> vertex(n);
是标准 C++。
【参考方案1】:
for(it=adj[i].begin();it!=adj[i].end();++it)
// ...
i=it->first;
// ...
此代码表现出未定义的行为,因为它将迭代器与一个容器进行比较,将迭代器与另一个容器进行比较。 it
被初始化为 adj[0].begin()
,然后 i
在循环内发生变化,在下一次迭代中,迭代器将与 adj[1].end()
进行比较
【讨论】:
以上是关于我正在尝试使用 c++ STL 制作 prims 算法。在迭代器第一次迭代后,它会停止代码并给出错误的输出的主要内容,如果未能解决你的问题,请参考以下文章
c++ stl::priority queue 使用 2 个键排序不正确
如何在 Eclipse CDT 中为 C++ STL 对象启用 gdb 漂亮打印?