我正在使用vector<pair<int,int> > ar[100000];
并且我必须将它用于几个测试用例,每次我想要它初始化但我得到了分段错误。
我尝试在测试用例循环内部全局声明。它适用于第一个测试用例或者只有一个测试用例。
我也尝试在每个测试用例后删除该向量,但我不知道删除此类向量的确切语法,任何帮助??
int main() {
long long a, b, c, d = 0, i, j, n, m, t;
scanf("%lld", &t);
while (t--) {
scanf("%lld %lld", &n, &m);
vector<pair<long long, long long> > ar[n + 9];
for(i = 0; i < m; i++) {
scanf("%lld %lld %lld",&a,&b,&c);
ar[a - 1].push_back(make_pair(b - 1, c));
ar[b - 1].push_back(make_pair(a - 1, c));
}
vector<long long> distance(10000, 100000000);
scanf("%lld", &a);
dijkstra(ar, a - 1, distance);
for (i = 0; i < n; i++) {
if (i == a - 1)
continue;
if (distance[i] != 100000000)
printf("%lld ", distance[i]);
else {
// printf("%lld\n", visited[i]);
printf("-1 ");
}
}
printf("\n");
// ar.clear();
distance.clear();
}
return 0;
}
答案 0 :(得分:2)
vector<pair<long long,long long> > ar[n+9];
在C ++中是非法的。必须在编译时知道C风格的数组维度。
如果您的编译器允许这样做,您必须使用编译器扩展,这可能会导致崩溃。例如,这可能导致堆栈溢出,尽管我们远远超出了C ++标准所涵盖的范围。
使用向量:
,而不是使用C风格的数组vector<vector<pair<long long,long long>>> ar(n+9);
然后它是合法的,如果你的内存不足,你会得到一个bad_alloc
异常。 (为这种情况添加catch
处理程序可能很有用。)
在使用它们之前,您还应检查数组索引是否超出范围。例如:
scanf("%lld %lld %lld",&a,&b,&c);
if ( a < 1 || a > ar.size() || b < 1 || b > ar.size() )
throw std::runtime_error("Edge out of bounds");
此外,您应在输入n < 10000
循环之前检查for(i=0;i<n;i++){
,因为i
用作distance
的索引。事实上,硬编码10000
在这里似乎很可疑。
或者,使用ar.at(a-1)
代替ar[a-1]
等,可以进行边界检查。