Отладка поиска векторов? - PullRequest
0 голосов
/ 16 октября 2011

Это в значительной степени продолжение отладки вставки карты , я применил предложенное там предложение, но теперь, когда понадобилось еще больше указателей, я действительно озадачен этим:

#include <stdio.h>
#include <vector>
#include <stack>
#include <map>

using namespace std;

class Nodo
{
public:
    vector<Nodo*> Relaciones;
    int Valor;
    bool Visitado;

    Nodo(int V)
    {
        Valor = V;
        Visitado = false;
    }

    Nodo()
    {
        Visitado = false;
    }
};

class Grafo
{
public:
    Nodo *Raiz;
    map<int, Nodo*> Nodos;

    Grafo(int V)
    {
        Raiz = new Nodo(V);
        Nodos.insert(pair<int, Nodo*>(V, Raiz));
    }

    void Insertar(int _1, int _2)
    {
        Nodo *Fuente = Nodos[_1];
        Nodo *Destino = new Nodo(_2);
        Nodos.insert(pair<int, Nodo>(_2, Destino));
        Fuente->Relaciones.push_back(Destino);
        Destino->Relaciones.push_back(Fuente);
    }

    pair<int, Nodo> Resultado;
    void DFS(Nodo Fuente)
    {
        stack<pair<int, Nodo>> St;
        St.push(pair<int, Nodo>(0, Fuente));
        Fuente.Visitado = true;
        while(!St.empty())
        {
            pair<int, Nodo> P = St.top();
            int Dist = P.first;
            Nodo N = P.second;
            St.pop();
            if(Dist < Resultado.first)
            {
                Resultado.first = Dist;
                Resultado.second = N;
            }
            for(int i = 0; i < N.Relaciones.size(); i++)
            {
                //Getting error C2664: 'Nodo::Nodo(int)' : cannot convert parameter 1 from 'Nodo *' to 'int' here
                Nodo *I = N.Relaciones[i];
                if(!I->Visitado)
                {
                    I->Visitado = true;
                    St.push(pair<int, Nodo>(Dist + 1, I));
                }
            }
        }
    }

    int Procesar()
    {
        DFS(*Raiz);
        Resultado.first = 0;
        DFS(Resultado.second);
        return Resultado.first;
    }
};

int main()
{
    Grafo* G;
    int Nodos = 0;
    scanf("%d", &Nodos);
    int _1, _2 = 0;
    scanf("%d", &_1);
    scanf("%d", &_2);
    G = new Grafo(_1);
    G->Insertar(_1, _2);
    Nodos--;
    while(Nodos - 1 > 0)
    {
        scanf("%d", &_1);
        scanf("%d", &_2);
        G->Insertar(_1, _2);
        Nodos--;
    }
    printf("%d" + G->Procesar());
    system("PAUSE");
}

Разве это не должно работать как есть?Я объявляю I указателем на Nodo, а оператор [] предназначен для того, чтобы дать мне просто указатель Nodo.

Если это важно, я использую VisualStudio 2011 настроена на отсутствие кодировки.

Ответы [ 2 ]

1 голос
/ 16 октября 2011

Я вижу несколько проблем с Insertar ...

    void Insertar(int _1, int _2)
    {
        Nodo *Fuente = Nodos[_1];
        Nodo *Destino = new Nodo(_2);
        Nodos.insert(pair<int, Nodo>(_2, Destino));
        Fuente->Relaciones.push_back(Destino);
        Destino->Relaciones.push_back(Fuente);
    }

1) Nodos [_1] - это не способ найти запись, связанную с ключом _1, потому что она создаст запись на вашей карте, если она еще не существует. Пожалуйста, используйте карту :: найти ().

2) Вставке пары передается Nodo *. Это неверно.

Я только посмотрел на эту функцию. Я уверен, что есть другие проблемы.

1 голос
/ 16 октября 2011

Поскольку на карте используется указатель, вам нужно вставить пару с указателем, изменить все

pair<int, Nodo>

до

pair<int, Nodo*>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...