展平图表

时间:2015-08-07 14:02:01

标签: graph tree

我有一个问题要解决,我相当肯定它不可解决。

对于我正在使用的系统,我需要采用一段分支逻辑(图形)并将其转换为线性路径(展平它),而不需要重复节点。鉴于一棵树,我知道我可以做到这一点。

规则是必须按顺序遍历路径,但如果满足某些条件,则可以“跳过”任何面板。

鉴于树:

  

A> B> ç

     

&安培;&安培;

     

A> D> ë

我们的树可以扁平化为:

  

A> B> C> D> ë

因此,在这种情况下,B和C共享相同的条件,而D和E具有该条件的倒数。因此,如果满足B则是C,但是将跳过D和E.相反,如果不满足B,则跳过B和C,但D和E不跳过。

到目前为止,这么简单。我相信任何一棵树都是如此。我遇到的问题是,我被赋予展平的对象是图形,包含简单的循环和封闭的行走。

在那个巨大的序言之后,我的问题是: 我是否正确地说,不可能保证这样的图表可以被夷为平地? 我知道封闭式散步不能遵循我的规则(通过返回节点),但是有没有其他规则可以描述“扁平化”图形而不是“非扁平化”图形?

干杯

1 个答案:

答案 0 :(得分:0)

如果它是有向图,那么如果没有有向循环,则可以展平图形。

有一个方便的库JGraphT,它将提供必要的方法来确定是否存在循环预设网以及也将执行扁平化的TopologicalOrderIterator。

使用图库和上面的示例,此代码将显示如何执行此操作的示例。

DirectedGraph<String, DefaultEdge> graph = new DefaultDirectedGraph<String, DefaultEdge>(DefaultEdge.class);

graph.addVertex("A");
graph.addVertex("B");
graph.addVertex("C");
graph.addVertex("D");
graph.addVertex("E");

// A > B
graph.addEdge("A", "B");

// B > C
graph.addEdge("B", "C");

// A > D
graph.addEdge("A", "D");

// D > E
graph.addEdge("D", "E");

// Uncomment the following line to create a cyclic graph.
//graph.addEdge("E", "D");

CycleDetector<String, DefaultEdge> cycleDector = new CycleDetector<String, DefaultEdge>(graph);

if (cycleDector.detectCycles()) {
    System.err.println("Cyclic graph");
} else {
    StringBuilder sb = new StringBuilder();

    // Create topological order iterator
    for (TopologicalOrderIterator<String, DefaultEdge> iter = new TopologicalOrderIterator<String, DefaultEdge>(
        graph); iter.hasNext();) {
    String vertex = iter.next();

    if (sb.length() > 0) {
        sb.append(" > ");
    }

    sb.append(vertex);
    }

    System.out.println(sb.toString());
}

禁用循环的示例输出。

  

A&gt; B> D> C> ë