与poj3352恰好相反,poj3352是求加多少边是桥不存在,poj3694是求加边后还剩多少桥。
利用poj3352的思想,我自己构思了一个算法,恰好总结了这几天学的东西。
分析题意,若加的边属于某边双连通分支,肯定不会减少桥的数目,而桥肯定是树边,它会将一棵子树与祖先割开,若加边(u,v),那么,u和v所在链将成为一个环,此环上必不存在桥,因此,每添加一条边,从u,v跑上lca将桥标记掉,并修改答案。
算法流程:
因为要求多次lca,干脆转成rmq,每次o(1)即可求出。
1、tarjan求桥,顺便将lca转成欧拉序列。
2、rmq初始化,用o(nlogn)时间,此后只需用o(1)时间求lca。
3、dfs求边双连通,并查集缩点。
4、在线回答问题,若u,v在同一集合,则无需修改答案,否则求出lca后,直接爬坡修改答案,顺便用并查集。