图论:在锦标赛图中找到获胜者的算法(如果有的话)

时间:2015-04-12 15:26:51

标签: algorithm graph-theory

在锦标赛图表中,如何确定是否有一名球员主宰了所有其他球员?这种算法的运行时间是多少?

基本上,我需要找出是否有一个元素,我可以从中找到所有其他元素,遵循外链路径。

澄清:这里;如果' a' beats' b'和' b' beats' c,然后a已经统治了' c。基本上如果' a'节拍' c'直接或间接地,它已经占据了主导地位。有可能' a'和' b'间接地互相支配,这就是胜利者可能存在或不存在的原因。也可能有不止一个赢家。

比赛图是一个有向图,其中每个元素与其余元素都有一个有向边。所以有n *(n-1)/ 2个有向边,其中n是顶点(玩家)的数量。 Wikipedia article on Tournament Graph

3 个答案:

答案 0 :(得分:4)

让我们使用T个顶点和N边调用原始图M。首先计算T的缩合,然后将其称为Gv的每个顶点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),但实现(和常量)是更简单。