如何表示在节点和可以有选择地消失的边之间允许有多个边的图


11

我正在尝试找出用于建模一些假设的理想化网络使用情况的数据结构。

在我的方案中,许多互相敌对的用户都试图组成已知所有潜在连接的计算机网络。但是,一个用户需要连接的计算机可能与另一用户需要连接的计算机不同;用户1可能需要连接计算机A,B和D,而用户2可能需要连接计算机B,C和E。

在此处输入图片说明

NCTM Graph Creator的帮助下生成的图像

我认为其核心将是无向循环图,其中节点表示计算机,边缘表示以太网电缆。但是,由于场景的性质,有一些不常见的功能可以排除邻接表和邻接矩阵(至少,没有进行不重要的修改):

  1. 边缘可能会限制使用;也就是说,如果一个用户获得了给定的网络连接,则其他任何用户都不能使用该连接
    • 在该示例中,绿色用户可能无法连接到计算机A,但是红色用户已将B连接到E,尽管它们之间没有直接链接
  2. 在某些情况下,一对给定的节点将通过多个边连接
    • 在该示例中,有两条独立的电缆从D到E,因此绿色和蓝色用户都可以直接连接这些计算机。但是,红色不再能建立这种联系
  3. 如果两台计算机通过一根以上的电缆连接,则每个用户最多只能拥有其中一根电缆

我需要在此图上执行一些操作,例如:

  • 确定是否为给定用户连接了任何特定的计算机对
  • 确定给定用户连接目标计算机的最佳路径
  • 识别给定用户的最高延迟计算机连接(即最长路径而不分支)

我的第一个想法就是简单地创建所有边缘的集合,但这对于搜索来说是很糟糕的。我现在想做的最好的事情就是修改一个邻接表,以使列表中的每个项目不仅包含边长,还包含其成本和当前所有者。这是明智的做法吗?假设空间不是问题,那么创建图的多个副本(每个用户一个)而不是单个图是否合理?


这似乎有些相关。youtube.com/watch?v=xdiL-ADRTxQ
RubberDuck

我没有真正看到这将如何在这里帮助。
流行

所以我考虑了一段时间。在大多数图形算法中,主要需要做两件事:枚举邻居或找到边的权重。您列出的所有问题仅涉及一个用户。对于单个用户,枚举邻居或找到边缘的权重既可以在固定时间内(如果用户计数受限制),也可以通过简单地用“所有权”镜像邻接列表或矩阵来在日志N中回答。为此,我认为这两种方法都可以轻松扩展,应该根据传统优势进行选择,而不会因用户部分而分散注意力。
J特拉纳2014年

Answers:


6

假设空间不是问题,那么创建图的多个副本(每个用户一个)而不是单个图是否合理?

在我看来,您应该使用可以标记“分层图”的内容,即为图添加组合器,例如@,这样:

  • 如果A和B是图,则A @ B也是图(即可以馈送到图库的算法中)。
  • A @ B中的顶点集是A和B中的顶点并集。
  • A @ B中的边集是A和B中的边的并集。
  • 结构A @ B不拥有任何顶点或边,而是使用A和B作为数据容器。

使用此类分层图,您可以将K定义为命令可用信息,R,G,B分别定义私人信息,以便每个玩家实际上看到的是R @ K,G @ K,B @ K。

要实际实现这一点,您可能会寻找一个通用实现图算法的图库,即最长路径算法等由图的实际表示来参数化。所以如果你的图书馆说

ConcreteGraphAlgorithms = GenericAlgorithms(ConcreteGraphImplementation)

您可以轻松地将其替换为

LayeredGraphAlgorithms = GenericAlgorithms(LayeredGraphs(ConcreteGraphImplementation))

您在哪里提供LayeredGraphs书架并从库中借用其余书架。


糟糕,无视我之前的评论,我误读了您的答案。尽管我没能利用现有的图库,但是基本上这就是我在做的事情,因为我愚蠢地不考虑看是否存在。
流行

1

您需要的被称为“归因图”。在属性图中,信息(属性)附加到弧上。加权图是最简单的属性图之一。

要表示属性图,可以通过添加额外的列或通过在每个单元格中添加更多信息来创建邻接矩阵来使用邻接表。如果您基于属性过滤圆弧,则大多数非归因图算法都将起作用。已经为属性图开发了许多算法,因此在此不再赘述。


1
可靠地邻接矩阵通常不能代表每对节点之间的多于1个边缘
JK。

1
@jk,通常您是正确的。但是,邻接矩阵中附加的信息可以具有弧的数量和每个弧的单独属性。但是在大多数情况下,我会使用邻接表,因为它会更简单。
walrii 2014年

1
如果您将每个边的信息都附加到单元格上,那么无论如何您实际上都有一个邻接列表,您将失去矩阵为密集图提供的优势
jk。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.