图表的所有子图 - 无知搜索(人工智能相关)

时间:2013-04-03 12:21:24

标签: algorithm graph depth-first-search

我需要编写一个程序,它必须能够使用像深度优先的算法找到图形的所有子图。事情是我无法理解我怎么能代表一组具有如下关系的节点:

A: A->B A->D A->F
B: B->A B->C 
C: C->B C->D
D: D->C D->A D->F
F: F->A F->D

在树中,所以我可以使用该算法。欢迎任何来源或解释。

1 个答案:

答案 0 :(得分:0)

图G“(V”,E“)是图G(V,E)的子图,如果:

  1. V“是V

  2. 的子集
  3. E“必须包含E中的所有边,连接V中存在的2个顶点

  4. 存储任意数量顶点的所有子图空间复杂度:

    TIME & SPACE = SUM { k * (|V|-k+1) } for k: 1..|V|
    
    TIME & SPACE = 1/6 n (n+1) (n+2)
    
    TIME & SPACE ~ O(|V|^3 + |V|^2 + |V| + ..)
    

    在英语中,你需要大量的空间,以保留所有可能的G子图。

    TIME & SPACE ~ SUM { (|V|-k+1) * SPACE(Gk) }
        for k: 1..|V|, SPACE(Gk): size of sub-graph with k nodes
    

    获取所有可能的子图的算法是一种强力算法..

    算法(在Java中):

    public class SubGraphs
    {
        public static ArrayList<Graph> getAllSubsets (Graph g)
        {
            // i: 1,2,3 .. |V|
            for (int i=1; i<graph.V.size(); i++)
            {
                addSubsets(subsets, i);
            }
        }
    
        public static void addSubsets (ArrayList<Graph>, int i)
        {
            // generate all k-permutations from set V
            ArrayList<Node[]> perm = generateAllPerm(graph.V, graph.V.size()-i);
    
            // Ex: abc ~ 3:abc ; 2:ab,ac,bc ; 1:a,b,c
            for (Node[] p : perm)
            {
                subsets.add(removeVerticesFromGraph(graph, p));
            }
        }
    }