我给出了一个连接图,其中N个节点(编号为1..N)和M个双向边包含一对(A,B)。边缘未加权。
我有K个人从节点1开始,我想探索图的每个节点。我花一个单位的时间让一个人从一个节点到另一个节点旅行。
探索每个节点需要多长时间?我正在寻找一种有效的算法来计算最小遍历时间,但我担心这是一个NP完全问题。 (但是对边数和人数的限制很小)。
答案 0 :(得分:1)
假设K为1.则最小化问题减少为找到至少一次触及每个节点的最小长度路径。
如果我们构造一个具有相同节点的新加权图G',并且每两个节点之间的边的权重是原始图中这些节点之间的最小距离,那么通过G中所有节点的最小长度路径是通过G'的最小长度汉密尔顿路径,即旅行营业员问题,这是众所周知的NP完全。
因此,对于至少一个K值,问题是NP完全。但是,对于较大的K值(例如,≥N),我们可以在更短的时间内生成最小解,因为我们可以只考虑最小生成树并找到最远元素的距离。我怀疑对于K的小值是否有任何这样的简化解决方案,但我肯定会使用MST作为寻找合理解决方案的启发式方法。
答案 1 :(得分:0)
在我看来,这就像BFS。
您可以像树一样查看图形,其中起始节点为根。从这个角度来看,如果叶子的数量<=人数,答案将是最深的叶子(距离根最远),而答案是该叶子的深度。 这是正确的,因为如果每个人都访问每个叶子,那么在访问过程中,所有节点都将被访问。
但是,如果在每个人访问一片叶子后仍然有未访问的节点,那么您已经在答案中添加了最接近的人访问该未访问节点所需的最长时间(或距离)。
但是,这不是完整的答案。比这更复杂。
如果您有以下图片:
您不想盲目地使用bfs。您可能希望按从最深到最深的顺序访问节点,因为这样就不必再次上下移动。例如,0-> 1-> 0-> 2-> 0-> 3-> 0-> 4比0-> 4-> 0-> 3-> 0-> 2-> 0->更有效1.正确的原因是因为您只能节省上一次遍历的时间,所以您希望使它最长。
此外,也许让另一个分支的人访问未访问的节点可能会更有效率(以帮助当前分支的人),因此,如果时间允许,您希望将未访问的节点分配给周围分支的人该人达到0所花费的时间少于当前分支中的人访问该分支中所有节点所花费的时间。如果可以将一个分支中的一个人分配到其他多个分支,则您要采用未访问节点数最多的分支。这个“帮手”的人也是为什么您要按顺序从最不深到最深访问节点,而不是仅最后访问最深节点。
所有这些听起来令人困惑,但关键是BFS。那就是您问题的解决方案。基本上是经过修改的BFS。
关于实现,您可以使用通常用于树遍历的递归(或堆栈)。并请注意,对于未访问的节点>人数的情况,您不必模拟到其余未访问的节点的旅行。