我遇到过这样的问题。
我们得到一个无向图,其中每条边都有一个值。现在额外的约束是不能从较高值边缘移动到较低值边缘。人们总是必须从较低价值转向较高价值。
图示该问题可以描述为
1
1 / \ 1
/ \
3 7
2 / \ 3
/ \
4 5
所以我们可以从7开始 - > 1 - > 3 - > 4而不是4 - > 3 - > 1.因此,在此图中,我们被要求在这里找出强连通组件,如(1,3,7)。
我试图使用Kosaraju的算法,但有这样的约束。
for v in adj[u]:
if not visited[v] and v.edgeValue >= u.edgeValue:
do work here
但我认为逻辑是错误的,我无法找出失败的原因。 有人可以指出错误并显示某种伪代码吗?
谢谢。
答案 0 :(得分:0)
嗯,在你的约束中,允许的方向取决于你的旅行历史。这使得连通组件具有不同的含义。我假设通过强连通分量表示对于来自任何顶点的子图,可以到达该子图的任何其他顶点。由于您的约束指定您不能从较低值边缘移动到较高值,这意味着任何强连接的子图包含具有相等加权边的树。
因此,在上面的示例中,您将(4,3)(3,5)(3,1,7)作为图形的一个特定分区成为强组件。您可以通过执行简单的DFS或BFS来获得这些,同时仅包含特定权重的边缘。