给定加权图的开始和结束的最短路径

时间:2019-07-03 23:36:09

标签: c++ graph

我必须读取一个文件才能创建加权图。必须使用文件中的输入找到最短路径。文件的结构将为第一行= numVertices,下面的每一行具有3个数字,分别为:0 1 2其中0是边的起点,1是边的终点,2是权重。我在创建图形时尝试实现邻接矩阵,但是没有运气。任何建议将不胜感激。

尝试重新构造我读取文件的方式,还尝试调整findShortestPath函数。

void createGraph(string file_name) //Function to create a graph based on a file, whose name is file_name.
{
    ifstream f(file_name);
    if (f.fail())
    {
        return;
    }
    string line;
    getline(f, line);
    int num = stoi(line);
    numVertices = num;

    int data[50][50];

    string line2;
    int num1 = 0, num2 = 0, num3 = 0;

    while (!f.eof())
    {
        f >> num1;
        f >> num2;
        f >> line2;
        num3 = stoi(line2);
        data[num1][num2] = num3;

    }

}
//////////////////shortest path function

string findShortestPath(int start, int end)
{
    int data[numVertices][numVertices];
    int dist[numVertices];
    bool sptSet[numVertices];
    int parent[numVertices];

    for (int i = 0; i < numVertices; i++)
    {
        parent[0] = -1;
        dist[i] = INT_MAX;
        sptSet[i] = false;
    }

    dist[start] = 0;

    for (int count = 0; count < numVertices - 1; count++)
    {
        int u = minDistance(dist, sptSet);
        sptSet[u] = true;
        if (sptSet[u] == end)
            break;

        for (int v = 0; v < numVertices; v++)
            if (!sptSet[v] && data[u][v] && dist[u] + data[u][v] < dist[v])
            {
                parent[numVertices] = end;
                dist[v] = dist[u] + data[u][v];
            }
    }
    printSolution(parent);

输出未输出最短路径,而是输出随机数。

2 个答案:

答案 0 :(得分:0)

findShortestPath函数中,data[numVertices][numVertices]data函数中的createGraph变量不同。

查看此https://www.geeksforgeeks.org/scope-of-variables-in-c/或尝试查找有关变量范围的其他来源。

答案 1 :(得分:0)

在函数findShortestPath中,您声明了一个名为data的本地数组,该数组应存储邻接矩阵数据。但是,您从未将任何数据写入其中!考虑将矩阵作为函数参数传递。您的函数签名应如下所示:

findShortestPath(int** data, int numVertices, int start, int end)

此外,请避免使用VLA,因为它不是标准的一部分。考虑使用new在堆上创建一个二维数组。 (并且不要忘记在完成后执行delete[]!)

或者,如果您不想手动管理阵列的生命周期,则可以使用std::vector<std::vector<int>>