返回最低节点的名称

时间:2018-05-29 22:16:25

标签: c++ vector dijkstra

首先,这是大学课程的一部分,所以虽然复制粘贴解决方案可行,但我正在寻找更深入的内容。不过我明天会见到我的主管。

现在解决问题了。我正在为5个链接节点A-E实现Dijkstra算法,它们的相关成本和链接存储在向量中;

struct Node
{
    char nodeLink;  //adjacent link
    int cost;       //cost of a link
};                  //to use in Dijkstra algorithm


class HeadNode
{
public:
    char Name;
    bool Visited;
    vector<Node> nodes;
    HeadNode(char x) { Name = x; Visited = false; }

};

class Graph
{
    char Start = 'A';
    char StartNode;
    char CurrentNode;
    char Destination = 'E';
    int TotalCost = 0;
    vector<HeadNode> hnode;
    vector<char> path;
    vector<int> weight;

public:
    Graph();
    void createHeadNode(char X);
    void createAdjMatrix();
    char LeastDistance(char node);
    void printAdjMatrix();
    void Dijkstra(char StartNode);
    char GetStartNode();
};



int main()
{   
    Graph graph;
    graph.createHeadNode('A');
    graph.createHeadNode('B');
    graph.createHeadNode('C');
    graph.createHeadNode('D');
    graph.createHeadNode('E');

    graph.createAdjMatrix();
    //graph.printAdjMatrix();
    graph.Dijkstra(graph.GetStartNode());

    system("pause");
    return 0;
}

Graph::Graph()
{
}


void Graph::createHeadNode(char x)
{
    hnode.push_back(x);

}

为了正确实现算法,我在类图中创建了一个前驱函数LeastDistance()。我也有一个获取起始节点的功能,但这在这里并不是特别重要;

char Graph::LeastDistance(char node)
{
    int smallest = 9999;
    char smallestNode;

    for (int i = 0; i < hnode.size(); i++)
    {
        for (int j = 0; j < hnode[i].nodes.size(); ++j)
        {
            if ((node == hnode[i].Name) && (hnode[i].nodes[j].cost <= smallest) && (hnode[i].Visited == false))
            {
                smallest = hnode[i].nodes[j].cost;
                smallestNode = hnode[i].nodes[j].nodeLink;
            }
            else
            {
                hnode[i].Visited = true;
                break;
            }
        }
    }
    TotalCost = TotalCost + smallest;
    return(smallestNode);
}

void Graph::Dijkstra(char StartNode)
{
    CurrentNode = StartNode;
    if (CurrentNode == Destination)
    {
        cout << "the start is the destination, therefore the cost will be 0." << endl;
    }
    else
    {
        while(true)
        {
            if (CurrentNode != Destination)
            {
                CurrentNode = LeastDistance(StartNode);
                cout << CurrentNode << "<-";
            }
            else if (CurrentNode == Destination)
            {
                cout << endl;
                cout << "The total cost of this path is:" << TotalCost;
                TotalCost = 0;//reset cost
                break;
            }
        }
    }

}

我的问题是LeastDistance功能似乎总是返回节点C,导致它被反复打印,因此它填满了控制台。到目前为止,我已经尝试使用Visual Studio 2017进行调试,但我对这些手表无法理解。我还调整了休息的顺序,并试图确保访问标志被设置为true。操作的优先级是否影响这个我不确定。

提前致谢。

1 个答案:

答案 0 :(得分:2)

我认为你实现这个问题的方式存在多个问题...但我认为引起你所描述问题的问题就在于声明:

if (CurrentNode != Destination)
{
    CurrentNode = LeastDistance(StartNode);
    cout << CurrentNode << "<-";
}

想想这是做什么的。我们假设您的第一个节点不是您正在寻找的节点,那么您调用最小距离并找到下一个最小节点。然后你打印它。然后,再次迭代while循环,发现CurrentNode不是您要查找的那个,因此您再次致电LeastDistance(StartNode),这将返回完全相同的价值。因此,您将继续打印相同的结果,显然是c

假设其他一切都是正确的,我想你想要:

CurrentNode = LeastDistance(CurrentNode);