我希望得到一个图的子图,给出顶点开始。连接到起始顶点的所有顶点都被视为应返回的子图的一部分。
我已经解决了这个问题,但我很好奇是否有更有效的解决方案。我想出的解决方案是做一个图的DFS并记录一个集合中遇到的每个顶点,然后,我简单地从原始图中的所有边连接到S和I中的顶点。从中建立了一个子图。原始图中的边缘存储在C#字典中,我认为它基本上是一个哈希值。
DFS和BFS不起作用,因为如果您有两个顶点都具有相同的子节点,则BFS或DFS将不会遍历其中一个边。因此,在这种情况下,子图将包含所有正确的顶点,但是会遗漏一些边缘对。
有没有比我提出的解决方案更好的解决方案?
答案 0 :(得分:3)
我认为BFS遍历是最有效的算法。
如果您执行BFS并为每个节点排队所有邻居(即遍历连接到当前节点的所有边缘),并且仅在当前节点具有遍历时中止遍历已经被访问过,你可以避免你用“同一个孩子”/“错过的边缘”描述的问题。
答案 1 :(得分:2)
一个“快速”算法,列举所有诱导子图 给定的大小可以在这里找到:
http://theinf1.informatik.uni-jena.de/~wernicke/motifs-wabi2005.pdf
这有帮助吗?