2

プログラムを作成した後にデバッグしようとすると、次のエラーが発生します。

ここに画像の説明を入力

これが私のコードです:

#include<fstream>
#include <iostream>
#include <vector>
#include <string>
#define MAXINT 2147483647

using namespace std;

struct Edge
{
int id, weight;

Edge(int y, int w)
{
    id = y;
    weight = w;
}
};

struct Node
{
vector <Edge *> Edges;
};

struct Graph
{
vector < Node *> vertices;
vector < int > indices;

void Resize(int x)
{
    if (vertices.capacity() < x)
        vertices.resize(x);
}

void InsertEdge(int x, int y, int weight)
{
    Resize(((x > y) ? x : y) + 1);
    InsertVertex(x);
    InsertVertex(y);
    vertices[x]->Edges.push_back(new Edge(y, weight));
}

void InsertVertex(int x)
{
    if (vertices[x] == NULL)
    {
        Node *t = new Node;
        vertices[x] = t;
        indices.push_back(x);
    }
}
};



void Dij(Graph const &g, int start)
{
Node *temp;
vector<bool> check;
vector<int>  distance, prev;
int v, w, weight, dist;

for (int i = 0; i <= g.indices.size(); i++)
{
    check.push_back(false);
    distance.push_back(MAXINT);
    prev.push_back(-1);
}

v = start;
distance[v] = 0;

while (!check[v])
{
    check[v] = true;
    temp = g.vertices[v];


    for (int i = 0; i < temp->Edges.size(); i++)
    {
        w = temp->Edges[i]->id;
        weight = temp->Edges[i]->weight;

        if (distance[w] > (distance[v] + weight))
        {
            distance[w] = distance[v] + weight;
            prev[w] = v;
        }
    }

    v = 1;
    dist = MAXINT;

    for (int x = 0; x < g.indices.size(); x++)
    {
        int i = g.indices[x];

        if (!check[i] && dist > distance[i])
        {
            dist = distance[i];
            v = i;
        }
    }
}
}

int main()
{
int startNode, nodeOne, nodeTwo, number;
Graph g;
ifstream myReadFile;
myReadFile.open("P:\\Documents\\New Folder\\Test\\src\\Read.txt");
while (!myReadFile.eof()) 
{
    myReadFile >> nodeOne;
    myReadFile >> nodeTwo;
    myReadFile >> number;
    g.InsertEdge(nodeOne, nodeTwo, number);
}

cout<< "Enter the starting node: ";
cin >> startNode;

Dij(g, startNode);

return 0;
}

迷惑な書式設定で申し訳ありません=/。dij メソッドの最後の for ループで壊れます。私が何を省略しているか知っている人はいますか?

4

2 に答える 2

8

パディは正しいです!

しかし、提案として、使用しないでくださいvector<bool>...

C++ の神々は、 store に省スペースのストレージ構造を作成したいと考えていましたbools。スペース効率を高めるために、彼らはbits. bitsC++ には単位がないため、使用せざるを得ませんでしcharsた。しかし、1文字は8ビットです!! C++ の神々は独自の解決策を思いつきました: 彼らは特別なメンバー型を作りました: referencebool にアクセスするためです。boolean他の方法で値にアクセスすることはできません。技術的にvector<bool>は、コンテナでさえありません。要素が であるという事実によりchars、イテレータを逆参照することはできません。

ビットを格納するためのはるかに優れたクリーンな方法は、bitsetクラスを使用することです。

于 2013-10-31T00:57:36.967 に答える