【算法专题】仙人掌图问题
【参考】
★WC2017-immortalCO Making Graph into Trees
【DFS树】
仙人掌图:每条边至多在一个环上的图。
仙人掌图中每个环相当于一个点双连通分量,那么用Tarjan算法处理dfs树。
对于树边(low[y]>dfn[x])直接处理,环边先忽略。
每个环只在其深度最小的点x处理,设深度最大的点为y,则找到(x,y)并进行处理(fa[y]≠x&&dfn[y]>dfn[x])。
例题:【BZOJ】1023: [SHOI2008]cactus仙人掌图 静态仙人掌(DFS树) 求直径,建立DFS树,环上单调队列维护。
例题:【BZOJ】4316: 小C的独立集 静态仙人掌 求最大独立集,建立DFS树,环上动态规划。
【圆方树】
原图每个点都是圆点,非环边直接相连。对于每个环,新建一个方点连接这个环的所有圆点(环边不连)。
建图方法同DFS树,在处理环的时候连接方点。取出一个环只要取出方点的所有邻点即可(按顺序)。
例题:【BZOJ】2125: 最短路 圆方树(静态仙人掌) 求多源最短路,建立圆方树,找LCA。
【点双】
对于无向连通图,对每个点双建立一个方点连向其中所有点并消除点双内部的连边,这样就是广义圆方树。
例如经典的旅行问题:询问带点权无向图中,两点间所有简单路径的最小权值。
两点间的简单路径并=两点间的唯一点双链。(如果存在一条其它路径到达,则与已有点双矛盾。)
所以建立广义圆方树后就是查询树链最小值的问题了。(每个方点的权=连接圆点的最小权)