我在Visual Studio上的代码堆栈溢出

时间:2016-12-25 06:04:27

标签: c++ visual-studio stack-overflow

我一直在为UVa Online Judge上的问题编写解决方案,并且在Visual Studio上测试我的代码时,它提供了

  

Light raods.exe中的0x01228249处的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000000,0x00A02000)。

消息,我不明白,因为我没有在代码本身发现任何错误。这是我的代码:

#include<iostream>
#include<fstream>
#include<queue>
#include<vector>
using namespace std;
#define MAX 1000000000
int m, n;
int main() {
    int aaa = 0;
    while (cin >> m >> n&&m != 0 && n != 0) {
        int totallength = 0;
        vector<pair<int, int>>neibs[200001];
        for (int i = 0; i < n; i++) {
            int x, y, z;
            cin >> x >> y >> z;
            neibs[x].push_back(make_pair(y, z));
            neibs[y].push_back(make_pair(x, z));
            totallength += z;
        }
        int totalmst = 0;
        int dist[200001];
        for (int i = 0; i <= m; i++) {
            dist[i] = MAX;
        }
        int treesize = 1;
        priority_queue<pair<int, int>>q;
        dist[0] = 0;
        bool intree[200001] = { 0 };
        intree[0] = 1;
        for (int i = 0; i < neibs[i].size(); i++) {
            int next = neibs[0][i].first;
            int val = neibs[0][i].second;
            dist[next] = val;
            q.push(make_pair(val, next));
        }
        while (treesize < m) {
            int minnode, mindis = MAX;
            minnode = q.top().second;
            mindis = q.top().first;
            intree[minnode] = true;
            totalmst += mindis;
            treesize++;
            for (int i = 0; i < neibs[minnode].size(); i++) {
                int next = neibs[minnode][i].first;
                int val = neibs[minnode][i].second;
                if (!intree[next] && dist[next] > val + dist[minnode]) {
                    dist[next] = val + dist[minnode];
                    q.push(make_pair(dist[next], next));
                }
            }
        }
        cout << totallength - totalmst << endl;
    }
    return 0;
}

我的代码或Visual Studio有问题吗?谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

您应该分配在堆中使用的两个向量:

std::unique_ptr<vector<pair<int, int>>> neibs(new vector<pair<int, int>>[200001]);

std::unique_ptr<priority_queue<pair<int, int>>> q(new priority_queue<pair<int, int>>());

答案 1 :(得分:0)

或尝试做类似的事情

template < class... Args >
std::vector< Args... > make_vector ( std::size_t const volatile size )
{ return std::vector< Args... >( size ) ; }

然后     auto vec0 = make_vector< int >( 200001 ) ;

但处理此类优化的最安全(唯一?)方法是关闭它们(使用编译器选项)。