我想制作一个更新/计算的图算法
节点f(n)
的值作为每个f(n)
值的函数
邻近节点。
更正式,
f(n) = max(f(n),max_i(f(n_i))), where i from neighbor 1 to neighbor k.
我可以想象一下这样做的几种方法,但我不知道到底有多远 它们是最佳的。
任何人都可以提出建议和评论(你是否认为 你的建议是最优的)或建议我能适应的任何现有的图算法?
答案 0 :(得分:6)
<强>要求:强>
在图表中的每个Strongly Connected Component V
中,此SCC中所有顶点的值具有相同的最终得分。
“证明”(指南):通过在此SCC中进行传播,您可以迭代地将所有分数设置为此SCC中找到的最大值。
在DAG中,每个顶点的值为max{v,parent(v) | for all parents of v}
(定义),并且可以在从开始到结束的单次迭代中找到分数。
“证据”(准则):没有“后边缘”,所以如果你知道所有父母的最终值,你就知道每个顶点的最终值。通过归纳(基础是所有来源) - 您可以了解单次迭代足以确定最终得分的事实。
此外,已知图表G'
代表a的SCC
图g
是DAG。
从上面我们可以推导出一个简单的算法:
G'
。请注意,G'
是DAG。V
:设置f'(V) = max{v | v in V}
(直观地 - 将每个SCC的值设置为此SCC中的最大值)。G'
。G'
中每个顶点的f'(V)。f(v) = f'(V)
(其中v在SCC V中)<强>复杂度:强>
G'
是O(V+E)
O(V+E)
O(V+E)
O(V+E)
所以上面的算法在图表的大小上是线性的 - O(V+E)