Assam ALzookery Ответов: 1

Как напечатать вывод 8 после интернирования образца ввода.


я знаю логику, стоящую за этим, но я не знаю, как применить ее, чтобы закончить мой код на выходе 8.

Чтобы получить 8, нужно было сложить самые короткие пути к каждой вершине графа. Кратчайший путь в программе 3 - это путь с наименьшим числом вершин. Если есть галстук, то вы используете вес пути в качестве выключателя галстука.

Может ли кто-нибудь помочь мне закончить мой код для вывода 8 после ввода образца ввода, как показано ниже?
Ввод:

4 6

Женщины Консерваторы Неоконсерваторы Ветераны

Козырь Женщины 1

Козырь Консерваторов 1

Trump Neocons 5

Женщины Неоконы 1

Ветераны Неоконов 5

Консерваторы Ветераны 1

**Выход:**

8

**Вот мой код:**


#include <iostream>
#include <vector>
#include <climits>
#include <cstdio>

using namespace std;

int min( int a,int b);
int getIndexOfVertex(string vertices[], int numberOfVertices,string name);
string extractMinVertex(bool visited[], string vertices[], int distanceFromStart[],int numberOfVertices);
void relaxEdges(string vertex, vector< vector<string> > &graph, vector< vector<int> > &weights, int distanceFromStart[], string vertices[], int);
void Dijkstra( int distanceFromStart[], string vertices[], vector< vector<string> > &graph, vector< vector<int> > &weights, int numberOfVertices );

bool pathExists( int u,int v, vector< vector<string> > &graph,int numberOfVertices,string vertices[]);
void dfs( int i, vector< vector<string> > &graph, bool visited[],int numberOfVertices,string vertices[] );

int main()
{
    ///freopen("input.txt","r",stdin);
    /// to store the number of vertices and the number of edges
    int numberOfVertices = 0;
    int numberOfEdges = 0;

    cin >> numberOfVertices;
    cin >> numberOfEdges;

    /// array to store the vertices. Number of vertices is 1 + numberOfVertices, since "Trump" is the first vertex
    numberOfVertices++;
    string vertices[ numberOfVertices];

    /// first vertex is Trump. From him, speeches have to be communicated to all groups
    vertices[0] = "Trump";

    for( int i=1; i<numberOfVertices; i++)
    {
        string name;
        cin >> name;

        vertices[i] = name;
    }

    /// graph is an adjacency list here. This graph vector stores the edges
    /// for each vertex, we store the list of vertices names, as a vector
    vector< vector<string> > graph( numberOfVertices );

    /// corresponding to the adjacency list, is this weight vector, that stores the weight of an edge
    vector< vector<int> > weights( numberOfVertices );

    for( int i=0; i<numberOfEdges; i++)
    {
        string u,v;
        int weight;

        cin >> v >> u >> weight;

        int uIndex = getIndexOfVertex( vertices, numberOfVertices, u );
        graph.at(uIndex).push_back( v );
        weights.at(uIndex).push_back( weight );
    }

    /*for (int i=0; i<numberOfVertices; i++)
    {
        cout << "Vertex " << vertices[i] << " : ";
        for( int j=0; j<graph[i].size(); j++)
            cout << graph[i][j] << " , ";

        cout << endl;
        cout << "Vertex " << vertices[i] << " : ";
        for( int j=0; j<weights[i].size(); j++)
            cout << weights[i][j] << " , ";
        cout << endl;
    }*/

    /// an array storing the distanc of vertices from the start
    int distanceFromStart[ numberOfVertices ];
    distanceFromStart[0] = 0;

    for (int i=1; i<numberOfVertices; i++)
        distanceFromStart[i] = INT_MAX;

    Dijkstra( distanceFromStart, vertices, graph, weights, numberOfVertices);
    int distance = 0;

    for( int i=1; i<numberOfVertices; i++)
        distance += distanceFromStart[i];

    cout << distance << endl;
    return 0;

}

/*bool pathExists( int u,int v, vector< vector<string> > &graph, int numberOfVertices, string vertices[])
{
    bool visited[ numberOfVertices ];
    for( int i=0; i<numberOfVertices; i++)
        visited[i] = false;

    dfs( u,graph,visited,numberOfVertices );

    return visited[v];
}
void dfs( int i, vector< vector<string> > &graph, bool visited[],int numberOfVertices , string vertices[])
{
    visited[i] = true;

    for( int j=0; j<graph[i].size(); j++)
    {
        if( !visited[ getIndexOfVertex(vertices,numberOfVertices,graph[i][j]) ] )
            dfs( getIndexOfVertex(vertices,numberOfVertices,graph[i][j]), graph, visited, numberOfVertices, vertices );
    }
}
*/

void Dijkstra( int distanceFromStart[], string vertices[], vector< vector<string> > &graph, vector< vector<int> > &weights, int numberOfVertices )
{
    bool visited[ numberOfVertices ];
    for( int i=0; i<numberOfVertices; i++)
        visited[i] = false;

    string vertex = extractMinVertex(visited, vertices, distanceFromStart, numberOfVertices);

    while( vertex.length() != 0  )
    {
        visited[ getIndexOfVertex( vertices, numberOfVertices, vertex ) ] = true;
        relaxEdges( vertex, graph, weights, distanceFromStart, vertices, numberOfVertices);

        vertex = extractMinVertex(visited, vertices, distanceFromStart, numberOfVertices);
    }

}

void relaxEdges(string vertex, vector< vector<string> > &graph, vector< vector<int> > &weights, int distanceFromStart[], string vertices[], int numberOfVertices)
{
    int uIndex = getIndexOfVertex( vertices, numberOfVertices, vertex );

    for( int i=0; i<graph[uIndex].size(); i++ )
    {
        int vIndex = getIndexOfVertex(  vertices, numberOfVertices,graph[uIndex][i] );
        distanceFromStart[ vIndex ] = min( distanceFromStart[vIndex], distanceFromStart[uIndex] + weights[ uIndex ][ i ]  );
    }
}

string extractMinVertex(bool visited[], string vertices[], int distanceFromStart[],int numberOfVertices)
{
    string ret = "";
    for( int i=0; i<numberOfVertices; i++)
    {
        if( !visited[i] && ret.length() == 0)
            ret = vertices[i];
        else if( !visited[i] )
        {
            if( distanceFromStart[ getIndexOfVertex( vertices,numberOfVertices,ret) ] < distanceFromStart[ getIndexOfVertex( vertices,numberOfVertices,vertices[i] )] )
            {
                ret = vertices[i];
            }
        }
    }
    return ret;
}

int min( int a,int b)
{
    if( a<b )
        return a;
    return b;
}

int getIndexOfVertex(string vertices[], int numberOfVertices,string name)
{
    for( int i=0; i<numberOfVertices; i++)
    {
        if( vertices[i].compare(name) == 0 )
            return i;
    }
    return -1;
}


Что я уже пробовал:

Я пытался вывести 8 без успеха, я не знаю, как закончить остальную часть кода

1 Ответов

Рейтинг:
1

Patrice T

Цитата:
Как напечатать вывод 8
Технически, это то, о чем вы просите:
cout << 8;

Но я не уверен, что это ответ на вашу проблему.
Мое предположение:
Да, в конечном счете, ваша программа не "печатает 8", но разве это проблема ? Я думаю, что это не так.
Что должна делать ваша программа:
1) получить данные
2) применить алгоритм к данным
3) выведите ответ на алгоритм, и да, ожидаемый ответ - 8

Как программист, ваша задача также состоит в том, чтобы отследить происхождение ошибок, и отладчик является для этого бесценным инструментом.
1) вам нужно убедиться, что введенные данные правильно хранятся в переменных, отладчик поможет вам убедиться в этом.
2) вам нужно убедиться, что ваш алгоритм делает то, что должен, здесь снова используйте отладчик.
3) вам нужно убедиться, что результат алгоритма напечатан правильно, здесь снова используйте отладчик.

Если проблема заключается в алгоритме, вы знаете, как алгоритм должен обрабатывать данные, с помощью отладчика вы сможете шаг за шагом определить, что ваша программа действительно делает, сравнивая с тем, что она должна делать, ошибка возникает тогда, когда она не совпадает.
не забывайте проверять переменные на каждом шаге.
-----
Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.