我试图解决在线法官的问题。给定n个顶点的无向图(< = 50000),最初没有边缘,然后给出m个边(< 100000),并且我们被要求在每次添加之后输出bridges的数量。时间限制是2秒。我知道桥搜索算法,它运行在O(N + M),而我的直接O(M *(N + M))可预测地超时。有人可以用合适的算法帮助我吗?
感谢。
答案 0 :(得分:1)
岛是节点的集合,这样您就可以从一个节点遍历到另一个节点而不会跨越任何桥。未连接到任何其他节点的单个节点是孤岛。
岛链是由桥梁连接的一系列岛屿。岛链是非循环的;如果你通过一座桥离开岛屿,除了同一座桥外,你不能返回岛上。请注意,这与组成岛链的节点集合是非循环的不同;个别岛屿可能包含周期。
向图表添加边缘时,请遵循以下规则来跟踪您的链,岛和桥梁:
如果添加了将岛连接到自身的新边,则该边不是桥。桥梁总数保持不变。
如果两个岛屿不属于同一个岛链,并且添加了连接它们的新边缘,则该边缘成为桥梁,两个岛链合并为一个岛链。
如果两个岛屿是岛链的一部分,并且添加了连接它们的新边缘,则必须合并一些岛屿以维护非循环性质。找到连接两个岛屿的岛链路径。对于以这种方式穿越的所有岛屿,包括两端的两个岛屿,将它们全部合并为一个岛屿。你以这种方式穿越的任何桥梁都不再成为桥梁。
通过这些步骤,您可以在向边缘添加边时保持图形中桥的数量。从未连接节点的图表开始。每个节点都是一个岛链,包含一个岛,其中包含一个节点。在添加边时,请参阅上面的三个规则,以根据需要合并岛和岛链。
岛可以表示为一组节点,岛链可以表示为岛的无向非循环图。该算法中最昂贵的部分是找到两个现有岛屿之间的路径;直观地说,我猜一个链中岛的数量相对于n
将保持较小,因此总复杂度将保持接近O(m)时间。