尽管我还是个新手,但我喜欢解决与图相关的问题(最短路径、搜索等)。最近我遇到了这样一个问题:
给定一个非定向、加权(没有负值)的图,具有N个节点和E条边(两个节点之间最多只有1条边,一条边只能放在两个不同的节点之间),以及一个必须访问的X节点列表,找到从节点0开始、访问所有X节点并返回节点0的最短路径。任意两个节点之间都至少有一条路径。
限制条件为:1 <= N <= 40,000 / 1 <= X <= 15 / 1 <= E <= 50,000
这里有一个例子:
红色节点(0)应该是路径的起点和终点。你必须访问所有蓝色节点(1、2、3、4)并返回。这里的最短路径将是:
0 -> 3 -> 4 -> 3 -> 2 -> 1 -> 0,总花费为30。
我考虑使用Dijkstra算法来找到所有X(蓝色)节点之间的最短路径,然后贪心地选择最近未访问的X(蓝色)节点,但它不起作用(在纸上得到的结果是32而不是30)。我后来注意到,仅仅找到所有X节点对之间的最短路径将需要O(X*N^2)的时间,这对于这么多节点来说太大了。
我能找到的唯一关于电路的东西是欧拉电路,它只允许访问每个节点一次(我不需要那个)。这个问题可以用Dijkstra解决吗?还是有其他算法可以解决这个问题?
给定一个非定向、加权(没有负值)的图,具有N个节点和E条边(两个节点之间最多只有1条边,一条边只能放在两个不同的节点之间),以及一个必须访问的X节点列表,找到从节点0开始、访问所有X节点并返回节点0的最短路径。任意两个节点之间都至少有一条路径。
限制条件为:1 <= N <= 40,000 / 1 <= X <= 15 / 1 <= E <= 50,000
这里有一个例子:
红色节点(0)应该是路径的起点和终点。你必须访问所有蓝色节点(1、2、3、4)并返回。这里的最短路径将是:
0 -> 3 -> 4 -> 3 -> 2 -> 1 -> 0,总花费为30。
我考虑使用Dijkstra算法来找到所有X(蓝色)节点之间的最短路径,然后贪心地选择最近未访问的X(蓝色)节点,但它不起作用(在纸上得到的结果是32而不是30)。我后来注意到,仅仅找到所有X节点对之间的最短路径将需要O(X*N^2)的时间,这对于这么多节点来说太大了。
我能找到的唯一关于电路的东西是欧拉电路,它只允许访问每个节点一次(我不需要那个)。这个问题可以用Dijkstra解决吗?还是有其他算法可以解决这个问题?