Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 竞赛图_Algorithm_Graph - Fatal编程技术网

Algorithm 竞赛图

Algorithm 竞赛图,algorithm,graph,Algorithm,Graph,竞赛是一个有向图(有向图),通过为无向完全图中的每条边指定方向而获得。也就是说,它是一个有向图,其中每对顶点由一条有向边连接 数据结构是邻接矩阵 有什么算法可以确定该图是否为竞赛图?编辑:遗漏了该图的完整部分 如果M是您的邻接矩阵,Mt是转置矩阵,~M是所有“位”都已反转的矩阵,A^B是两个矩阵之间的逐位异或 那么矩阵就是一个竞赛iff: ~(M^Mt)=I邻接矩阵中有n^2个条目,您需要所有条目中的信息来解决问题。(您需要1来检查是否存在正确的边,0来检查后边是否不存在。)因此,由于您必须从矩

竞赛是一个有向图(有向图),通过为无向完全图中的每条边指定方向而获得。也就是说,它是一个有向图,其中每对顶点由一条有向边连接

数据结构是邻接矩阵


有什么算法可以确定该图是否为竞赛图?

编辑:遗漏了该图的完整部分

如果
M
是您的邻接矩阵,
Mt
是转置矩阵,
~M
是所有“位”都已反转的矩阵,
A^B
是两个矩阵之间的逐位异或

那么矩阵就是一个竞赛iff:


~(M^Mt)=I

邻接矩阵中有n^2个条目,您需要所有条目中的信息来解决问题。(您需要1来检查是否存在正确的边,0来检查后边是否不存在。)因此,由于您必须从矩阵中读取至少N^2个条目,因此整个问题必须花费至少O(N^2)个时间

关于BFS搜索尝试:如果您的遍历需要O(n^2)——由于需要在邻接矩阵中查找边,它将需要O(n^2)——那么不管后缘检查是否为常数时间,总体算法仍然是O(n^2)


另一种看待这个问题的方法是:由于边的数量等于可能的顶点对的数量,因此将有n*(n-1)/2条边,即O(n^2)。你的遍历是O(V+E),因此是O(n+n^2),因此是O(n^2)


由于此算法的最佳情况时间为O(n^2),您不妨简单地循环通过矩阵的右上半部分(对角线上方),并检查每个条目,a)为1,或b)其转置等价物为1。

要添加到tonfa的注释中:

简介:算法“针对每个i≠ j、 检查(i,j)和(j,i)中的一个是否在图中“是渐近最优的”

更多详情: 仅仅读入邻接矩阵需要花费Ω(n2)的时间。所以在o(n2)时间内没有办法解决这个问题。但是让我们忽略输入


假设矩阵已经在内存中。为了确保图形的无向版本是完整的,您必须以某种方式确定,对于每个i≠ j、 图中至少有一条边(i,j)和(j,i)。由于您只有邻接图,这意味着您必须在某个点上为每个i访问(i,j)或(j,i)中的至少一个≠ J没有其他方法可以保证完整性。验证这一点需要n(n+1)/2=O(n2)个步骤。

这听起来像是一个家庭作业问题。也许你可以详细阐述你自己关于这个问题的想法,我们可以在你遇到困难的地方帮助你?只有当每个节点都可以从你的起始节点到达时,这种保证才是正确的——这里不一定是这样(设想一个简单的例子,连接到所选起始节点的所有边都指向它,而不是远离它)。此外,@unknown:请记住,这里的数据结构是一个邻接矩阵;查找节点的边需要O(n)个时间。因此,仅遍历图仍然需要O(n^2)时间。是的。但是如果你的遍历需要O(n^2)——因为需要在邻接矩阵中查找边,所以需要O(n^2)——那么不管后缘检查是不是常数时间,整个算法仍然是O(n^2)。还有另一种方法来看待这个问题:因为边的数量等于可能的顶点对的数量,所以会有n*(n-1)/2条边,这就是O(n^2)。你的遍历是O(V+E),因此是O(n+n^2),因此是O(n^2)。这实际上并不能保证所有的顶点对都是连接的。Foreach?你不能做Foreach,它将是O(n^2)。每条边的点是什么?我会检查我访问过的每条边。如果你唯一的数据结构是邻接矩阵,我想它只能是O(n**2)。如何?有向图的邻接矩阵(不带边权重)有
O(|V | ^2)
布尔单元格,其中
|V |
是图形中的顶点数。无论图形是空闲的还是密集的,都必须检查
O(|V | ^2)
matrix单元格,以便访问每一条可能的边。实际上,要证明tonfa是正确的,这是一个相当简单的心理练习:邻接矩阵中有n^2个条目,您需要所有条目中的信息来解决问题。(您需要1来检查是否存在正确的边,0来检查后边是否不存在。)因此,由于您必须从矩阵中读取至少N^2个条目,整个问题必须至少花费O(N^2)时间。“更多详细信息:仅读取邻接矩阵需要O(n2)时间。所以没有办法在o(n2)时间内解决这个问题。“不是真的。可能有多个组件需要o(n^2)时间,结果仍然是o(n^2)。请记住,o()表示法是基于顺序的,不是时间的实际函数。