1

vector に問題がありますが (push_back の使用で)、追加の g++ フラグ -O2 を使用した場合にのみ表示されます (必要です)。

#include <cstdio>
#include <vector>

typedef std::vector<int> node;
typedef std::vector<node> graph;

int main()
{
    int n, k, a, b, sum;
    bool c;
    graph g(n, node());
    c = scanf("%i%i", &n, &k);

    for(int i=0; i<n; i++)
    {
        sum=2;
        for(int j=0; j<i; j++)
            sum*=2;
        for(int j=0; j<sum; j++)
        {
            if(j%2==0)
                c = scanf("%i", &a);
            else
            {

                c = scanf("%i", &b);
                a += b;
                g[i].push_back(a); //---------------LINE WHICH CAUSES SEGMENTATION FAULT
            }

        }
    }

    for(int i=n-2; i>=0; i--)
    {
        for(size_t j=0; j<g[i].size(); j++)
        {
            if(g[i+1][(j*2)] >= g[i+1][(j*2)+1])
                g[i][j] = g[i+1][j*2];
            else
                g[i][j] = g[i+1][(j*2)+1];
        }
    }

    printf("%i\n", g[0][0]);

    return 0;
}
4

3 に答える 3

4

私はあなたが持っていると思います:

graph g(n, node());
c = scanf("%i%i", &n, &k);

逆の順序で。現状では、グラフのサイズ設定に使用する変数「n」は初期化されていません。

于 2010-02-13T17:20:43.103 に答える
3

入力操作の前にベクトルを初期化するnということは、恐ろしい未定義動作を呼び出していることを意味します。ここで述べたように、プログラムはその後何でもすることができます。

于 2010-02-13T17:17:16.870 に答える
2

nコメントですでに述べたように、初期化すると完全に機能します。最初の行を次のように変更します。

int n, k, a, b, sum;
int c;
c = scanf("%i%i", &n, &k); // initialize n *first*
if(c != 2) return -1; // scanf does not return bool but the number of parsed arguments
graph g(n, node());
于 2010-02-13T17:24:42.973 に答える