在树上的旅行推销员

时间:2013-06-27 19:21:58

标签: algorithm tree graph-algorithm

所以,我有N个节点和N-1个边缘。因此,图表可以表示为树。现在,我需要找到至少一次到达每个节点所需的最小距离。 N的上界为10 ^ 5.

有没有办法在合理的时间内完成这项工作?可能有这个问题的名称,但如果是这样,我找不到它。

我知道TSP是NP完全的。但是,由于这个图是一棵树,我想知道是否有这个问题的实际解决方案。

感谢。

3 个答案:

答案 0 :(得分:2)

如果这是一棵树,那么深度优先或广度优先tree traversal是访问每个节点的简单方法。这是O(N)操作。

如果它对你没有任何影响,那么使用深度优先遍历,因为它使用更少的内存,IMO更容易实现。

答案 1 :(得分:0)

您可以做的是隔离图中的周期并将它们分组为一个巨型节点。执行此操作时,您应该有一个有向的非循环图组,这些组是由节点组成的循环。找到到达dag中每条路径的最短路径很容易,因此在这一点上唯一的事情就是确保每个组的端点与要遍历的组中的正确节点连接。

答案 2 :(得分:0)

好吧,我最终自己解决了这个问题。基本上,访问节点中每棵树的最短路径将遍历每个边缘两次,除了从原点到距离原点最远的节点的路径。因此,您使用dfs,并存储最长的路径。 这是我的代码。

long long dfs(int a, int b){ //a is the current node, b is the node you reached the current node from.
ll ans=0;
for(int i=0;i<elist[a].size();i++){ //elist is just a vector of all the edges.
    int x=elist[a][i];
    if(x==b) continue;          //this checks to make sure you aren't going straight back to the previous node you visited.
    ans=max(ans,cost[a][i]+dfs(elist[a][i],a)); //ans is the longest distance. Cost is an array of all the edge costs.
}
return ans;

}