【算法专题】仙人掌图问题

【参考】

仙人掌相关问题的处理方法(未完待续)

★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。

【点双】

对于无向连通图,对每个点双建立一个方点连向其中所有点并消除点双内部的连边,这样就是广义圆方树。

例如经典的旅行问题:询问带点权无向图中,两点间所有简单路径的最小权值。

两点间的简单路径并=两点间的唯一点双链。(如果存在一条其它路径到达,则与已有点双矛盾。)

所以建立广义圆方树后就是查询树链最小值的问题了。(每个方点的权=连接圆点的最小权)

 

posted @ 2018-01-19 10:55  ONION_CYC  阅读(3867)  评论(0编辑  收藏  举报