3

请原谅我对图论词汇的小知识。

我只能用常见的英语单词来描述这个问题。也许有人可以指出我正确的方向和/或查找的条件。

这个问题是作为可视化编程语言实现的一部分出现的。其中一个顶点是一个函数/方法,边在函数之间传输数据。现在有以下问题:

可以允许将具有Collection< TItem >类型的顶点 A 的输出连接到具有TItem类型的顶点 B 的输入。然后将类型为 TItem 的顶点 B 输出到类型为Collection< TItem >的输入顶点 C 。这将告诉编译器它必须在顶点 B 周围包装一个foreach函数,以将 B 的函数应用于来自 A 的集合中的每个项目,并将新项目作为集合输出到 C 的输入。所以从 A 到 B 的边是多对一连接,从 B 到 C 是一对多。

现在实际的问题是,什么样的算法会找到一个被一对多连接包围/隔离的(有向)子图?以便编译器围绕这个特定的子图包装一个 foreach 函数?我试图想象这张照片中的问题:

在此处输入图像描述

4

2 回答 2

2

请注意,您的图表中可能有多个这样的子图。

要查找每个节点,您访问图中的所有节点并计算父/子以确定它是否是所需集合的成员,然后将所有标记的节点分离到它们各自的子图或派系中。可以在 Wikipedia: The Clique Problem上找到处理派系的一般程序。

于 2014-03-07T19:46:00.450 回答
1

我建议使用以下算法:

步骤 1遍历所有节点。如果找到蓝色节点,请在有向图中进行深度优先搜索,以找出可从它到达的白色节点集。做 DFS 时不要穿过蓝色节点。连同节点集,存储您在 DFS 期间发现的起始蓝色节点和传出蓝色节点。

您最终会得到多组白色节点,以及有关传入和传出蓝色节点的信息:

在此处输入图像描述

(忍耐一下,我的鼠标绘图技术真的很差)

步骤 2如您所见,您可能有重叠。解决这个问题有两种可能:

  • 之后使用不相交集数据结构合并重叠集。这导致O(n² + m)最坏情况运行时。

  • 首先通过修改标准 DFS 算法来避免创建重叠。它应该检测您何时到达您在先前探索的集合之一中已经看到的节点。然后它不应该进一步探索子图,而是记录当前探索的集合和重叠的集合稍后将被合并。之后,您可以在合并图中找到连接的组件。这将为您提供 O(n + m)运行时,这要好得多。

您最终会得到一组不相交的白色节点集以及相应的传入和传出蓝色节点:

在此处输入图像描述

于 2014-03-07T19:55:01.637 回答