用Python在具有邻接列表的竞赛中查找哈密顿路径
竞赛是一个完整的有向图,给定任意两个顶点u和v,它们之间存在一条有向边(如果u赢了v,则边是从u到v) 竞赛中总是存在一条哈密顿路径。给定形式为{u:[v,w],v:[w]}的邻接列表,其中有一条从u到w,从u到v,从v到w的有向边,我如何找到哈密顿路径,并按顺序打印它的真值 即使你不懂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或者其他什么,只要算法就很有帮助了。我已经考虑过了,我想我必须从最高向外度的顶点开始?然后添加第二高阶的顶点等,直到最低阶的顶点。但我不认为这是一种故障安全的方法,度数最高的顶点可能会被次高的顶点打败
提前感谢您的帮助 您可以递归地解决这个问题。假设有名为
v_0
到v_n
的n+1
顶点<对于大小为n的竞赛,code>v_1tov_n
以及它们之间的边,因此我们可以假设有一个哈密顿路径,包含v_1
tov_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!非常感谢你!解释得很好,我理解。