C++11 运行时错误(SIGBART)-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>

我在SPOJ上遇到了问题,我不断地得到一个运行时错误(SIGABRT),我从来没有真正经历过这种情况。当我在VS中运行代码时,它工作正常,但SPOJ给了我这个错误。我想知道你能否告诉我为什么我会得到它

这是我的密码:

#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)