C# 在有向图中寻找被某些性质隔离的子图
请原谅我对图论词汇了解不多 我只能用普通的英语单词来描述这个问题。也许有人能给我指出正确的方向和/或术语来查找 这个问题是可视化编程语言实现的一部分。其中顶点是函数/方法,边在函数之间传输数据。现在出现了以下问题: 可以允许将集合类型为C# 在有向图中寻找被某些性质隔离的子图,c#,algorithm,graph,graph-theory,subgraph,C#,Algorithm,Graph,Graph Theory,Subgraph,请原谅我对图论词汇了解不多 我只能用普通的英语单词来描述这个问题。也许有人能给我指出正确的方向和/或术语来查找 这个问题是可视化编程语言实现的一部分。其中顶点是函数/方法,边在函数之间传输数据。现在出现了以下问题: 可以允许将集合类型为的顶点A的输出连接到类型为TItem的顶点B的输入。然后将类型为TItem的顶点B输出到类型为Collection的输入顶点C。这将告诉编译器,它必须围绕顶点B包装一个foreach函数,以便将B的函数应用于a集合中的每个项,并将新项作为集合输出到C的输入。因此,
请注意,图形中可能有多个子图
要查找每个节点,请访问图中的所有节点并计算父节点/子节点的数量,以确定它是否为所需集合的成员,然后将所有标记的节点分离到各自的子图或群中。处理派系的一般程序可以在维基百科上找到:。我建议使用以下算法: 步骤1遍历所有节点。如果您找到一个蓝色节点,请在有向图中执行以下操作,以找出可从该节点访问的白色节点集。执行DFS时不要跨越蓝色节点。与节点集一起,存储DFS期间发现的起始蓝色节点和传出蓝色节点 最终将得到多组白色节点,以及有关传入和传出蓝色节点的信息: (忍着点,我的鼠标画技术真的很差) 步骤2如您所见,可能存在重叠。解决这个问题有两种可能:
- 通过使用“后续”合并重叠集。这将导致O(n²+m)最坏情况下的运行时间
- 通过修改标准DFS算法,首先避免创建重叠。它应该检测您何时到达一个节点,该节点已在先前探索的集合中看到。然后,它不应该进一步探索子图,而是记录当前探索集和重叠集将在以后合并。之后,您可以在合并图中找到连接的组件。这会给你一个惊喜 O(n+m)运行时,这要好得多
恐怕我既不知道您正在构造什么图形,也不知道您希望在图形中找到什么集合。你能不能从你的问题中抽象出更多的东西,描述你想要找到的图形和集合,而不把它与你真正想要做的事情联系起来?你似乎有不同类型的顶点和/或边,颜色可以很好地区分,而类型的东西对我个人没有帮助。这似乎是任意的。内部节点呢?在DAG中不存在像OP图那样的派系,那你这是什么意思?你还意识到寻找派系是一个NP难问题吗?@NiklasB。找到一个集团不是NP难的,找到一个基数最大的集团是NP难的。此外,团是为无向图定义的。@G.Bach:当然,但OPs路径是定向的。我想我知道你的意思,但你应该更明确一点。但你是对的,找到包含最大团不是太难,但团不是我们需要的。我们需要连接subgraphs@NiklasB. 找到任何团都是很简单的,用一种简单的方法找到某个包含最大团是O(n^2),找到一个最大团是NP困难的。我看不出派系在这里扮演什么角色,因为图表是有方向的。这是最优秀、最实用的。修改后的深度优先搜索听起来很实用。@thalm:我刚刚注意到,您甚至不需要DSU数据结构。如果发现重叠,请记住稍后需要合并这两个集合。然后执行第二个DFS以在合并图中查找连接的组件。