我正在尝试使用 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 < nvertex[] 数组初始化为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&lt;std::vector&lt;int&gt;&gt; 作为您的邻接列表。使用运行时整数声明数组是 gcc 特有的 您在调试代码时看到了什么? int vertex[v]; -- 这不是有效的 C++。您已经在使用std::vector,所以问题是——您知道std::vector 的用途吗?它是做你现在拥有的非 C++ 代码应该做的事情。 std::vector&lt;int&gt; 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 算法。在迭代器第一次迭代后,它会停止代码并给出错误的输出的主要内容,如果未能解决你的问题,请参考以下文章

在 Cython 中使用 C++ STL 映射

c++ stl::priority queue 使用 2 个键排序不正确

将 C++ 成员函数指针传递给 STL 算法

如何在 Eclipse CDT 中为 C++ STL 对象启用 gdb 漂亮打印?

使用 C++ Boost 或 STL 和 Mysql 存储和检索图像

使用 OpenCV 修复混合 STL 实现