作者:古韵卡次 | 来源:互联网 | 2023-09-23 23:53
POJ3694NetworkTarjan求边双连通+LCS+并查集题目链接:POJ3694Network题意:给定N个顶点M条边的无向图。N(1≤N≤100,0
POJ 3694 Network Tarjan求边双连通+LCS+并查集
题目链接:
POJ 3694 Network
题意:给定 N个顶点M条边的无向图。N(1 ≤ N ≤ 100,000) and M(N - 1 ≤ M ≤ 200,000). 数据保证
图是连通的。 然后Q个操作(Q <1000), 每次往图中添加一条边,每次操作之后给出图中还有多少个桥(割边)。
思路:这是一道很有意思的题目!首先对原图进行边双连通缩点,求出DAG,因为初始的无向图是连通的,那么求出来的DAG是一棵树(PS:为了以后求LCA,我需要保存每个节点的父节点和深度),树上的边全是桥,这是无向连通图的性质嘛。
求出DAG树之后,我们理解为我们新构建了一个
有向图。
然后每次添加一条边(u, v),如果两个顶点在原图中的同一个边双连通,毫无疑问,不需要处理。反之, 就向上找最近公共祖先节点设为x,并把沿途的节点加入并查集中,因为添加一条边,相当于在树上增加一条边,即形成了
u → x → v 的一个环,那么
环上所有的边都不是桥了,这是显而易见的。
求公共祖先节点的时候利用了
并查集 压缩路径 的一个思想,DAG图中,同一个强连通分量中,深度高的节点直接跳转到他的祖先的位置(我让祖先一定是同一个强连通分量中深度最低的节点,并查集中
合并的时候可以保证到这点),这样就不必要一个个向上走了,这个在 代码中有所体现。
这样就是344MS水过了。
测试数据 可以参考 Discuss 提供的测试数据。 注意,
无向图边数要开双倍,时刻记住,谨记谨记~
#include