问题描述
首先,我创建了一个顶点、边和权重的无向图。
在 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
这是调试输出和我在 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.
解决方法
for(it=adj[i].begin();it!=adj[i].end();++it){
// ...
i=it->first;
// ...
}
此代码表现出未定义的行为,因为它将迭代器与一个容器进行比较,并将迭代器与另一个容器进行比较。 it
用 adj[0].begin()
初始化,然后 i
在循环内发生变化,并在下一次迭代中将迭代器与 adj[1].end()