如何解决我正在尝试使用 C++ STL 制作 prims 算法迭代器第一次迭代后,它会停止代码并给出错误的输出
-
vertex[]
数组被初始化为INT_MAX
,所有索引i < n
除了0
索引。到目前为止,它将具有最小的权重。 -
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 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 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,1,2);
addEdge(adj,2,8);
addEdge(adj,3,21);
addEdge(adj,4,6);
addEdge(adj,0);
addEdge(adj,5);
addEdge(adj,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
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.
解决方法
for(it=adj[i].begin();it!=adj[i].end();++it){
// ...
i=it->first;
// ...
}
此代码表现出未定义的行为,因为它将迭代器与一个容器进行比较,并将迭代器与另一个容器进行比较。 it
用 adj[0].begin()
初始化,然后 i
在循环内发生变化,并在下一次迭代中将迭代器与 adj[1].end()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。