用Python在具有邻接列表的竞赛中查找哈密顿路径

用Python在具有邻接列表的竞赛中查找哈密顿路径,python,algorithm,graph,tournament,Python,Algorithm,Graph,Tournament,竞赛是一个完整的有向图,给定任意两个顶点u和v,它们之间存在一条有向边(如果u赢了v,则边是从u到v) 竞赛中总是存在一条哈密顿路径。给定形式为{u:[v,w],v:[w]}的邻接列表,其中有一条从u到w,从u到v,从v到w的有向边,我如何找到哈密顿路径,并按顺序打印它的真值 即使你不懂python或者其他什么,只要算法就很有帮助了。我已经考虑过了,我想我必须从最高向外度的顶点开始?然后添加第二高阶的顶点等,直到最低阶的顶点。但我不认为这是一种故障安全的方法,度数最高的顶点可能会被次高的顶点打败

竞赛是一个完整的有向图,给定任意两个顶点u和v,它们之间存在一条有向边(如果u赢了v,则边是从u到v)

竞赛中总是存在一条哈密顿路径。给定形式为{u:[v,w],v:[w]}的邻接列表,其中有一条从u到w,从u到v,从v到w的有向边,我如何找到哈密顿路径,并按顺序打印它的真值

即使你不懂python或者其他什么,只要算法就很有帮助了。我已经考虑过了,我想我必须从最高向外度的顶点开始?然后添加第二高阶的顶点等,直到最低阶的顶点。但我不认为这是一种故障安全的方法,度数最高的顶点可能会被次高的顶点打败


提前感谢您的帮助

您可以递归地解决这个问题。假设有名为
v_0
v_n
n+1
顶点<对于大小为n的竞赛,code>v_1to
v_n
以及它们之间的边,因此我们可以假设有一个哈密顿路径,包含
v_1
to
v_n
。根据该路径将它们重命名为
u\u 1
u\u n
。现在找到
u_i
,这样
u i
就赢得了
v_0
v_0
就赢得了
u i+1
(这里你应该注意边缘节点:
v_0
已经赢得了
u 1
或者
u n
已经赢得了
v_0
)。在找到这样的
i
之后,整个哈密顿路径可以构造为:

u_1 , ... , u_i , v_0 , u_i+1 , ... , u_n

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

O(n^2)算法描述如下:O(nlogn)算法描述如下:谢谢@PeterdeRivaz和@Vasei!非常感谢你!解释得很好,我理解。