我一直在为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有问题吗?谢谢你的帮助。
答案 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 ) ;
但处理此类优化的最安全(唯一?)方法是关闭它们(使用编译器选项)。