【问题标题】:Algorithm for a directed graph problem有向图问题的算法
【发布时间】:2009-11-06 14:54:49
【问题描述】:

请帮我解决以下问题的算法 -

鉴于一系列事实,我们希望尽可能多地消除冗余。这个问题涉及的事实是大写字母之间传递关系的成员。因此,每个事实都是一对大写字母,例如 AB,表示 A 与 B 相关。字母可能与自身相关,也可能不相关,但传递性成立:如果 A 与 B 相关且 B 与 C 相关,那么我们可以推断 A 与 C 有关。 创建一个包含方法 minFacts 的类 FactCount ,该方法给定一个已知的 String[] 并返回最小事实集的大小,这将允许我们推断可以从包含的事实中推断出的所有内容(并且仅是那些事情)已知。

known 的每个元素将包含 1 个或多个由单个空格分隔的事实。最小的事实集可能包含可以从已知中推断出但不包含在其中的事实。

例如:

{"AB AC CA AA BC", "AD"}

返回:4

AB、CA、BC 和 AD 允许我们同时推断 AA(AB、BC、CA 通过传递性给出 AA)和 AC(AB、BC 通过传递性给出 AC),并且没有更小的子集可以让我们推断所有已知的事实。

P.S - 这不是家庭作业。只是我在网上找到的一个问题,几个小时都无法解决......

【问题讨论】:

    标签: algorithm graph-theory


    【解决方案1】:

    在我看来,您正在寻找图表的spanning tree

    连通图 G 的生成树 也可以定义为最大集 G 的不包含环的边, 或作为最小的边集 连接所有顶点。

    从生成树中,您可以得到图形的最小表示。任何其他添加的边都会创建一个循环,因此节点之间的关系会产生冗余信息。

    另外请注意,如果在算法结束时,您还剩下未连接的节点(意味着您的图中有 MST 未触及的节点),这意味着您获得的生成树是独立实体,并且没有关系(边)连接生成树的节点和不在其中的节点。

    在更数学的术语中,属于你的生成树的节点和不属于它的节点是不相交的集合,它们都不是空集。

    您当然可以在剩余的子集上再次执行 MST 搜索以生成生成森林,直到您用尽您的节点集。

    【讨论】:

    • 你能指出一个算法来找到有向图的最小生成树吗?在 Google 上找不到。
    • 如果你在 python 中工作,有 NetworkX。这是一个非常完整的图书馆。 networkx.lanl.gov/reference/generated/…
    • 对于算法,只需复制他们使用的内容;)
    • 十这是克鲁斯卡尔算法。它是为加权图制作的,但你应该没有问题。只需为每条边分配相同的权重。当然,MST 并不是唯一的。
    • Kruskal 的算法不适用于有向图。但是找到了这个链接 - algowiki.net/wiki/index.php/Edmonds's_algorithm
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2017-09-13
    • 2016-06-17
    • 2012-12-25
    • 2014-04-24
    • 2013-04-27
    相关资源
    最近更新 更多