Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
C# 在有向图中寻找被某些性质隔离的子图_C#_Algorithm_Graph_Graph Theory_Subgraph - Fatal编程技术网

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的输入。因此,

请原谅我对图论词汇了解不多

我只能用普通的英语单词来描述这个问题。也许有人能给我指出正确的方向和/或术语来查找

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

可以允许将集合类型为的顶点A的输出连接到类型为TItem的顶点B的输入。然后将类型为TItem的顶点B输出到类型为Collection的输入顶点C。这将告诉编译器,它必须围绕顶点B包装一个foreach函数,以便将B的函数应用于a集合中的每个项,并将新项作为集合输出到C的输入。因此,从a到B的边是多对一连接,从B到C的边是一对多连接

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


请注意,图形中可能有多个子图


要查找每个节点,请访问图中的所有节点并计算父节点/子节点的数量,以确定它是否为所需集合的成员,然后将所有标记的节点分离到各自的子图或群中。处理派系的一般程序可以在维基百科上找到:。

我建议使用以下算法:

步骤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以在合并图中查找连接的组件。