我在一个竞赛中有一个问题(该竞赛已在几周前结束)。我解释的问题是-:
给出由(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 时限:3.0秒
我解决问题的方法是:
找到从每个节点到每个其他节点的路径,并将其存储在数组列表中。
遍历所有列表,查找数组中是否包含u和v路径。
如果找到路径,则计算起始节点和结束节点的gcd,并检查最大gcd。
但是我认为我的方法太暴力了,代码太长了,而且我认为它太复杂了。
有人可以提出任何建议或方法来解决这个问题吗?
答案 0 :(得分:0)
也许您可以在起始和终止顶点上进行dfs处理,然后从那些顶点中删除子图中已经存在的那些顶点。现在,您拥有了所有可能成为解决方案一部分的顶点。从这些顶点检查所有可能的组合,然后选择最大gcd对。 在df期间,请确保添加一个if条件,以忽略与该顶点相连的顶点,以便在子路径的每一侧仅获得不属于子路径一部分的顶点