在C ++ map中查找图的起始节点

时间:2014-05-13 15:42:12

标签: c++ graph map

假设我有一些门票可以从某些地方到其他地方。但这些都不合适。所以我们假设我有以下门票:
输入:[(' E',' F'),(' D',' E'),(' C&# 39;,' D'),(' A',' B'),(' B',' C' ;)]
现在我想找到一个完整的路径,我可以使用这些门票来旅行全程 输出:[(' A',' B'),(' B',' C'),(' C&# 39;,' 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()方法)。 我现在可以想到的任何选项都需要额外的空间:
我可以很容易地找到终端节点。然后通过反转所有边缘来创建新地图。这样就可以找到从终端节点到起始节点的路径 2.找到计数为1的节点(仅限2,开始和结束节点)。现在我们可以轻松找到终端节点。这样我们就可以了解起始节点。

两种建议的方法都需要额外的空间。任何人都可以建议我找到起始节点的简单方法。

1 个答案:

答案 0 :(得分:2)

你知道从开始到结束的路径有多长(在你的情况下为5)。对于您拥有的每张票,您可以确定从开始到完整路径结束的长度。例如。对于票D,E,其余长度仅为2.所以只需检查所有票,直到找到A,B,剩余长度5等于总长度。不需要额外的空间,但O(N * N)运行时间。 [编辑] 实际上,O(N * N * log(N))因为地图查找是O(log N)