用于基于相邻节点计算节点值的图算法

时间:2012-10-24 13:52:02

标签: algorithm graph graph-theory graph-algorithm

我想制作一个更新/计算的图算法 节点f(n)的值作为每个f(n)值的函数 邻近节点。

  • 图表是直接的。
  • 每个节点都有初始f(n)值。
  • 每条边都没有成本(0)。
  • 每个节点的值是其当前值的最大值 每个相邻节点的值(有向图,所以邻居是那些 从节点有传入边缘的地方)。

更正式,

f(n) = max(f(n),max_i(f(n_i))), where i from neighbor 1 to neighbor k.

我可以想象一下这样做的几种方法,但我不知道到底有多远 它们是最佳的。

任何人都可以提出建议和评论(你是否认为 你的建议是最优的)或建议我能适应的任何现有的图算法?

1 个答案:

答案 0 :(得分:6)

<强>要求:

  1. 在图表中的每个Strongly Connected Component V中,此SCC中所有顶点的值具有相同的最终得分。
    “证明”(指南):通过在此SCC中进行传播,您可以迭代地将所有分数设置为此SCC中找到的最大值。

  2. DAG中,每个顶点的值为max{v,parent(v) | for all parents of v}(定义),并且可以在从开始到结束的单次迭代中找到分数。
    “证据”(准则):没有“后边缘”,所以如果你知道所有父母的最终值,你就知道每个顶点的最终值。通过归纳(基础是所有来源) - 您可以了解单次迭代足以确定最终得分的事实。

  3. 此外,已知图表G'代表a的SCC 图g是DAG。

  4. 从上面我们可以推导出一个简单的算法

    1. 图中的最大SCC(可以使用Tarjan algorithm完成),并创建SCC图。设为G'。请注意,G'是DAG。
    2. 对于每个SCC V:设置f'(V) = max{v | v in V}(直观地 - 将每个SCC的值设置为此SCC中的最大值)。
    3. Topological sort图表G'
    4. 根据(3)中的拓扑排序进行单次遍历 - 并根据其父项计算G'中每个顶点的f'(V)。
    5. 设置f(v) = f'(V)(其中v在SCC V中)
    6. <强>复杂度:

      1. Tarjan和创建G'O(V+E)
      2. 查找f'与图表的大小呈线性关系 - O(V+E)
      3. 拓扑排序在O(V+E)
      4. 中运行
      5. 单遍历 - 线性:O(V+E)
      6. 给出最终得分:线性!
      7. 所以上面的算法在图表的大小上是线性的 - O(V+E)