在c++地图中查找图的起始节点

Find start node of a graph in C++ map

本文关键字:节点 查找 c++ 地图      更新时间:2023-10-16

假设我有一些从一些地方到另一些地方的票。但这些都不是顺序的。假设我有这样的票:
输入:[(E, F),("D"、"E"),(' C ', ' D '),("A"、"B")("B"、"C")]
现在我想找到一条完整的路径,我可以用这些票走完全程
输出:[("A"、"B")("B"、"C"),(' C ', ' D '),("D"、"E"),(E, F)]

为了在c++中实现它,我使用c++ stl map。我的c++示例代码如下:

void find_path(std::map<char, char> mymap, char start_node)  
{  
    cout << start_node;
    char val = start_node; 
    while (mymap.count(val) > 0)
    {
        val = mymap.find(val)->second;
        cout << val;
    }
}
int main()  
{
        std::map<char,char> mymap;  
        mymap['E'] = 'F';  
        mymap['D'] = 'E';  
        mymap['C'] = 'D';  
        mymap['A'] = 'B';  
        mymap['B'] = 'C';
        char start_node = find_node(mymap);
        std::cout<<"start node is " << start_node << "n";
        find_path(mymap, start_node);      
}

现在我有点卡在如何找到开始节点(如何写find_node()方法)。我现在能想到的任何选项,都需要额外的空间:
1. 我可以很容易地找到结束节点。然后通过反转所有的边来创建一个新的地图。这样就能找到从结束节点到开始节点的路径。
2. 查找计数为1的节点(只有2个,开始和结束节点)。现在我们可以很容易地找到结束节点。这样我们就知道起始节点了。

建议的方法都需要额外的空间。谁能告诉我一个简单的方法来找到开始节点

您知道从开始到结束的路径长度(在您的示例中为5)。对于您拥有的每张票,您可以确定从起点到完整路径终点的长度。例如,对于票D,E,剩下的长度只有2。检查所有的票,直到找到A,B它的剩余长度为5等于总长度。不需要额外的空间,但运行时间为O(N*N)。(编辑)实际上,O(N*N*log(N))因为映射查找是O(log N)