查找具有子路径并具有最大gcd的路径(开始节点,结束节点)

时间:2018-12-30 14:46:35

标签: java graph greatest-common-divisor undirected-graph

我在一个竞赛中有一个问题(该竞赛已在几周前结束)。我解释的问题是-:

  

给出由(N-1)个边连接的无向无环图   和N个节点。该图保证已连接。给定两个节点   u和v,您必须找到图的两个节点x和y,使得   这两个节点之间的路径与给定之间的路径重叠   完全位于u和v,并且最大可能出现gcd(x,y)。

约束

1 <= N <= 5 * 10 ^ 5

1 <= a,b,u,v <= N

其中a,b是图中的两个任意节点。

示例让图具有10个节点(1到10)

现在在前面的行中,我将给出两个整数a和b,这意味着a和b直接连接。

1 4

1 5

1 2

4 3

4 6

5 7

2 10

2 9

2 8

最后 v 4 2

答案-4

从u到v的路径是4-> 1-> 2

现在,可以完全忽略从u到v的路径的一些路径是:

4-> 1-> 2-> 10

3-> 4-> 1-> 2-> 9

4-> 1-> 2-> 8

以此类推。...

请注意,选择从4到8的路径会完全重叠路径u到v,并且gcd(4,8)= 4,这是可能的最大值。

图形为: https://i.stack.imgur.com/Phkwi.png Graph 时限:3.0秒

我解决问题的方法是:

找到从每个节点到每个其他节点的路径,并将其存储在数组列表中。

遍历所有列表,查找数组中是否包含u和v路径。

如果找到路径,则计算起始节点和结束节点的gcd,并检查最大gcd。

但是我认为我的方法太暴力了,代码太长了,而且我认为它太复杂了。

有人可以提出任何建议或方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

也许您可以在起始和终止顶点上进行dfs处理,然后从那些顶点中删除子图中已经存在的那些顶点。现在,您拥有了所有可能成为解决方案一部分的顶点。从这些顶点检查所有可能的组合,然后选择最大gcd对。 在df期间,请确保添加一个if条件,以忽略与该顶点相连的顶点,以便在子路径的每一侧仅获得不属于子路径一部分的顶点