在Python中使用邻接列表查找锦标赛中的哈密尔顿路径

时间:2016-04-23 17:22:14

标签: python algorithm graph tournament

锦标赛是一个完整的有向图,因此给定任意两个顶点u和v,它们之间存在有向边(如果你胜过v,那么边是从u到v)。

哈密尔顿之路始终存在于锦标赛中。所以给出了{u:[v,w],v:[w]}形式的邻接列表,其中有从u到w,u到v和v到w的有向边,我如何找到汉密尔顿路径是按顺序打印veritces?

即使你不了解python或其他什么,只要算法会非常有用。我已经考虑过了,我想我必须从最高度的顶点开始?然后添加具有第二高度等的顶点,直到具有最低度的顶点。但是我不知道这是一种失败安全的方法,具有最高度的顶点可能被顶点击败,具有第二高的顶点。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以递归地解决此问题。假设您有n+1个顶点v_0v_n。对于大小为n的锦标赛,v_1v_n以及它们之间的边缘,因此我们可以假设我们的哈密尔顿路径包含v_1v_n。根据{{​​1}}到u_1的路径重命名它们。现在找到u_nu_i赢得u_iv_0赢了v_0(这里你应该处理边缘节点:{{1} }赢了u_i+1v_0赢了u_1)。在找到这样的u_n之后,整个哈密顿路径可以构造为:

v_0

该算法的运行时间为O(n ^ 2)。这个问题存在O(nlogn)算法。