我正在尝试使用 C++ STL 制作 prims 算法迭代器第一次迭代后,它会停止代码并给出错误的输出

问题描述

首先,我创建了一个顶点、边和权重的无向图。

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.

Photo attached of output on console

解决方法

for(it=adj[i].begin();it!=adj[i].end();++it){
  // ...
  i=it->first;
  // ...
}

此代码表现出未定义的行为,因为它将迭代器与一个容器进行比较,并将迭代器与另一个容器进行比较。 itadj[0].begin() 初始化,然后 i 在循环内发生变化,并在下一次迭代中将迭代器与 adj[1].end()

进行比较

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...