C++11 运行时错误(SIGBART)-SPOJ双色
我在SPOJ上遇到了问题,我不断地得到一个运行时错误(SIGABRT),我从来没有真正经历过这种情况。当我在VS中运行代码时,它工作正常,但SPOJ给了我这个错误。我想知道你能否告诉我为什么我会得到它 这是我的密码:C++11 运行时错误(SIGBART)-SPOJ双色,c++11,runtime-error,C++11,Runtime Error,我在SPOJ上遇到了问题,我不断地得到一个运行时错误(SIGABRT),我从来没有真正经历过这种情况。当我在VS中运行代码时,它工作正常,但SPOJ给了我这个错误。我想知道你能否告诉我为什么我会得到它 这是我的密码: #include <iostream> #include <stdio.h> #include <vector> #include <string> #include <queue> #include <map>
#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
#include <queue>
#include <map>
using namespace std;
vector<int> marked;
vector<vector<int>> edges;
bool colorable;
void bfs(int v) {
colorable = true;
switch (marked[v]) {
case 0:
case 1:
marked[v] = 1;
for (int i = 0; i < edges[v].size(); i++) {
if (marked[edges[v][i]] != 1) {
marked[edges[v][i]] = 2;
}
else {
colorable = false;
break;
}
}
break;
case 2:
for (int i = 0; i < edges[v].size(); i++) {
if (marked[edges[v][i]] != 2) {
marked[edges[v][i]] = 1;
}
else {
colorable = false;
break;
}
}
}
}
int main() {
int N, M, a, b;
while (scanf("%d", &N) != 0) {
colorable = true;
while (N--) {
marked.push_back(0);
edges.push_back({ });
}
scanf("%d", &M);
while (M--) {
scanf("%d", &a);
scanf("%d", &b);
edges[a].push_back(b);
edges[b].push_back(a);
}
for (int i = 0; i < marked.size(); i++) {
bfs(i);
}
colorable ? printf("BICOLORABLE\n") : printf("NOT BICOLORABLE\n");
marked.clear();
edges.clear();
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
矢量标记;
矢量边;
布尔可着色;
无效bfs(int v){
可着色=真;
开关(标记为[v]){
案例0:
案例1:
标记为[v]=1;
对于(int i=0;i
我曾尝试在谷歌上搜索其他类似的问题,以及SIGABRT错误到底是什么,但我仍然感到困惑。谢谢你的帮助。我发现了这个问题,如果有人有类似的问题,我会在这里发布。线路
while(scanf("%d", &N) != 0)
显然,斯波吉并不欣赏他。我把它分成两行
scanf("%d", &N);
while(N !=0 ) {}
一切都很顺利。感谢您的评论帮助我理解错误。我发现了问题,如果有人遇到类似问题,我将在这里发布。线路
while(scanf("%d", &N) != 0)
显然,斯波吉并不欣赏他。我把它分成两行
scanf("%d", &N);
while(N !=0 ) {}
一切都很顺利。感谢您的评论,以帮助我理解错误。
SIGABRT
是一种特殊功能,它告诉您该函数已用于终止程序,这通常是由于未处理的异常或类似情况而完成的。如果您试图分配大量内存,您正在读取的数据集有多大?N在1到1024之间,M在1到30000之间。这意味着您的程序最多可以使用235MB(可能更多,取决于std::vector
如何分配内存)。这几天,在PC上的不是那么多,但是SpJ支持它吗?哦,而且在一个不相关的注释上,为什么在C++程序中使用<代码> SCAFF < /C>和<代码> Prtff<代码>?至少有人告诉我。SPOJ建议使用它们。我不确定SPOJ是否支持它,你知道如何检查吗?或者我需要用另一种方法来解决这个问题吗?SIGABRT
是一种特殊的函数,它告诉您该函数已被用于终止程序,这通常是由于未处理的异常或类似情况而完成的。如果您试图分配大量内存,您正在读取的数据集有多大?N在1到1024之间,M在1到30000之间。这意味着您的程序最多可以使用235MB(可能更多,取决于std::vector
如何分配内存)。这几天,在PC上的不是那么多,但是SpJ支持它吗?哦,而且在一个不相关的注释上,为什么在C++程序中使用<代码> SCAFF < /C>和<代码> Prtff<代码>?至少有人告诉我。SPOJ建议使用它们。我不确定SPOJ是否支持它,你知道如何检查吗?或者我需要用不同的方法来解决这个问题吗?这两个代码块做不同的事情。第一个将scanf(“%d”和&N)
(即可以读取的元素数)的返回值与零进行比较。通常检查您是否达到EOF(文件结束)。第二种方法将N的值与零进行比较,这是完全不同的。读取N并检查N在一行中是否不同于0的一种方法是执行while(scanf(“%d”、&N)&&N!=0)
,或者简单地执行while(scanf(“%d”、&N)&&N)
。这两个代码块执行不同的操作。第一个将scanf(“%d”和&N)
(即可以读取的元素数)的返回值与零进行比较。通常检查您是否达到EOF(文件结束)。第二种方法将N的值与零进行比较,这是完全不同的。读取N并检查N在一行中是否不同于0的一种方法是执行while(scanf(“%d”、&N)&&N!=0)
,或者简单地执行while(scanf(“%d”、&N)&&N)
。