在锦标赛图表中,如何确定是否有一名球员主宰了所有其他球员?这种算法的运行时间是多少?
基本上,我需要找出是否有一个元素,我可以从中找到所有其他元素,遵循外链路径。
澄清:这里;如果' a' beats' b'和' b' beats' c,然后a已经统治了' c。基本上如果' a'节拍' c'直接或间接地,它已经占据了主导地位。有可能' a'和' b'间接地互相支配,这就是胜利者可能存在或不存在的原因。也可能有不止一个赢家。
比赛图是一个有向图,其中每个元素与其余元素都有一个有向边。所以有n *(n-1)/ 2个有向边,其中n是顶点(玩家)的数量。 Wikipedia article on Tournament Graph
答案 0 :(得分:4)
让我们使用T
个顶点和N
边调用原始图M
。首先计算T
的缩合,然后将其称为G
。 v
的每个顶点G
代表T
的几个顶点;此外,您可以在T
中从任何此顶点到达另一个顶点。此外,G
是DAG。因此,如果G
中只有一个顶点,其中in-degree等于0(让我们称之为v0
),这意味着您可以从{{中的顶点开始到达原始图中的任何顶点1}}。如果v0
对应v0
中的单个顶点,那么它就是您正在寻找的顶点。复杂性为T
。
答案 1 :(得分:2)
一种方法是采用每个顶点,并以该顶点作为根深度搜索图形。对于每个深度搜索,您检查是否已访问过每个其他顶点。如果有,则对应于该顶点的玩家支配图中的所有玩家。如果您熟悉C ++,我可以在这里编写程序。时间复杂度为~O(N ^ 3)。你需要更快的算法吗? N是顶点数
答案 2 :(得分:1)
如果某个玩家占据了其他所有人,那么图中只有一个顶点v没有传入边。从v开始执行DFS。如果你可以到达每个其他顶点,则v是主要顶点。
编辑1:正如kaktusito建议的那样,我们可以在应用DFS之前压缩图表。
编辑2:看起来没有必要显式计算所有连接的组件,应用压缩,构造DAG并找到主导顶点。相反,这是一个更简单的解决方案:
首先在图表上执行DFS并找到具有最高完成时间的节点v。如果图表有赢家,那么v必须在其中。否则会有另一个顶点u使得v可以从u到达并且具有较晚的完成时间。现在找到其他获胜者,使用VFS中的DFS或BFS找到转置图中从v可到达的所有节点。此算法的复杂性仍然是O(V + E),但实现(和常量)是更简单。