【问题标题】:Obtain a tree from a graph by specifing root and leaves通过指定根和叶从图中获取树
【发布时间】:2014-05-10 00:46:04
【问题描述】:

我正在查看 jgrapht 和 jung,但我似乎找不到任何方法可以让我做我想做的事。

我有一个图,通过指定一个根节点和一些叶子,我想从中获取一棵树,或者如果这不可能,至少是一个错误。

jgraphT 和 jung 似乎都有从图中获得最小生成树的算法,但是获得的树是随机的,没有人向我保证给定节点将是叶子节点,而另一个节点将是中继节点... .

【问题讨论】:

  • 您的问题不清楚。你是说你想要一个算法将一个图、一个节点列表和一个根作为输入,并且如果你可以将该图解释为具有该根和那些叶子的树,则返回一棵树?或者可以是那个Graph的一个子图(生成树),也就是一定要使用原Graph的所有边吗?
  • 不,我不需要使用原始图的所有边...我有一个图,在这个图中我指定哪个节点是我的根,哪些节点是我的叶子,休息的节点是简单的继电器。我想要一棵树,它能让我从根部接触到每一片叶子。我不需要使用所有节点或边,重要的是根和所有叶子都是最终树的一部分。
  • 是否可以接受您未指定的叶子是最终树的一部分,或者必须指定所有叶子?如果您不使用原始图的所有节点(假设您有一个包含多个连接组件的图,或者您的“根”有一个无法从根到达的父级),是否可以接受?您这样做是为了解决什么总体问题?
  • 您指定哪些节点是叶子和根,未标记的节点可以用作中继或不使用(即如果根和叶子之间已经存在直接连接,则无需包含中间节点)。我正在尝试从网络中创建一棵树(这将是一个无向且连接的图),即获得一个没有循环的网络,其中每个叶节点都可以从根到达。我会将未使用的链接/节点保存在某个地方,以便在一个链接或节点掉落的情况下实现一些冗余(在这种情况下,如果可能的话,我只需对剩余节点重复算法以获得一棵新树)

标签: java jung jgrapht


【解决方案1】:

如果您只考虑一个叶子的问题,那么这会转移到“是否存在从根开始到叶子结束的遍历,至少访问每个其他节点一次?”

这听起来很像最长路径问题......这是 NP 难题。 (而且我不认为添加更多的叶子有帮助。:))

我可以想到启发式方法(以及证明特定图表或根/叶选择的方法,即问题没有解决方案),但我怀疑一般来说您将不得不使用穷举搜索方法,类似这样:

  1. 从叶子中删除所有出边。
  2. 如果您无法从根目录访问所有内容(BFS 将在此处执行),则没有解决方案。
  3. 从根开始遍历图。
  4. 在每一步:
    如果您还没有到达所有的叶子并且没有更多的边缘可以遍历,那么就没有解决方案。 如果您已到达所有叶子并且已访问所有节点,那么您就完成了。
    否则,遍历您尚未遍历的边。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多