在给定多个顶点的情况下查找所有可能的有向图

Posted

技术标签:

【中文标题】在给定多个顶点的情况下查找所有可能的有向图【英文标题】:Finding all possible directed graphs given a number of vertices 【发布时间】:2019-07-29 18:51:11 【问题描述】:

给定一对顶点以及它们之间存在边的信息是否可以找到所有可能的有向图?例如,如果我们知道具有边对的顶点,例如

1 2
2 3
1 3

可能的有向图将是:

1→2, 2→3, 1→3 
1→2, 2→3, 3→1 
1→2, 3→2, 1→3 
1→2, 3→2, 3→1 
2→1, 2→3, 1→3 
2→1, 2→3, 3→1 
2→1, 3→2, 1→3 
2→1, 3→2, 3→1 

这里要使用什么数据结构?工作逻辑是什么?

我正在考虑使用邻接矩阵数据结构并计算所有可能的邻接矩阵。每个邻接矩阵将代表一个图。我们可以在需要时将图表用于检查是否存在循环等任务。

抱歉,这更像是一个讨论而不是编程问题,但我们将不胜感激

【问题讨论】:

每条边都可以向一个方向或另一个方向延伸,所以看起来答案是 2^n,其中n 是边数,假设每条边都是单向的。 @user5994461 我实际上并没有询问获得的图表数量,而是获得的图表。 这个不清楚。 “所有可能的有向图”与给定的“顶点对和它们之间存在边的信息”有什么关系?此外,您的话与您的示例输入不一致,该输入是一组顶点对,而不是图形和顶点对。我们可以猜出您想说什么并要求确认,但您应该找到怎么说的方法。使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。否则您将无法搜索、询问或编码解决方案。 您的问题是什么?讨论是题外话。询问“方法”是题外话。您没有给出选择一种方法而不是另一种方法的标准。您基本上是在要求我们在您不付出任何努力的情况下解决您的问题。尽可能多地制定解决方案,并在遇到困难时提出一个具体问题。 【参考方案1】:

您可以维护一个无向图数据结构 G,并且知道边 (u,v) 的存在意味着在有向图可能性 D 的特定实例中只有一条有向边。

如果您想分别维护所有可能的有向图,则需要 2^m 个,其中 m 是边数。如果顶点和边总是相同的,只有方向是不变的,那么你可以维护 2^m 位串,每个长度为 m。每个位都有 0 或 1,具体取决于它对应的边 (u,v) 是 u-->v 还是 v

您可以使用位串来构造一个有向图。但是,至少为每个“图”仅维护一个位串而不是重复整个图数据结构而仅进行方向更改会更有内存效率。在哈希表中记录位串:使用每条边作为键,然后根据方向使用位值 0/1。许多可能的有向图 D 之一的任何图遍历都适用于无向 G。然后在恒定时间内,您可以检查顶点的事件(无向)边,这些边在 D 中是传出/传入的。因此,遍历可以通过保持只有 1 个图形对象和 1 个大小为 2^m(而不是 2^m 个图形对象)的哈希表。

【讨论】:

伟大的工作。所有可能的位串都会给出所有可能的有向图,但我认为很难确定每个有向图中是否有一个循环。我最初的任务是找出这些图表中的每一个是否都是非循环的。我的意思是逻辑部分,如果我真的为每种可能性维护一个图形数据结构,那将非常容易。然后我可以使用 DFS 算法轻松找到循环。但考虑到时间复杂度,那将是最糟糕的。只要弄清楚逻辑,您的算法就可以更快。如果你找到算法请分享,对你有很大帮助。

以上是关于在给定多个顶点的情况下查找所有可能的有向图的主要内容,如果未能解决你的问题,请参考以下文章

C ++:在给定以下文本输入的情况下找到有向图的度数

BZOJ2791 Rendezvous

到给定顶点的所有最短路径

求有向图两个顶点间的最短路径的方法,用简单语言或举例描述。

有向图中的欧拉电路

算法笔记_023:拓扑排序(Java)