CodeForces 178B1 - Greedy Merchants tarjan求双联通分量+tarjan离线求最近公共祖先
题意:
有一个联通无向图...有K个商人要在K对点间运货...问这K个商人各自经过了多少个桥...
题解:
此题用到了两个tarjan..第一个tarjan是用来求双联通分量缩点的..第二个tarjan是用来离线求一堆点对的最近公用祖先...
既然是要找桥...那么首先对这个无向图进行缩点...把每个双联通块缩成一个点...这样图就成了一颗树..树中的每条边都是桥...问题转化为在一颗树中从一点到另一点的距离...数据范围这么大..想到了LCA...完全不记得怎么用tarjan求LCA了..看了各种资料..才写出来...
关于tarjan求LCA...这个博文不错摘抄最经典的一段:
//parent为并查集,FIND为并查集的查找操作//QUERY为询问结点对集合//TREE为基图有根树 Tarjan(u) visit[u] = true for each (u, v) in QUERY if visit[v] ans(u, v) = FIND(v) for each (u, v) in TREE if !visit[v] Tarjan(v) parent[v] = u
Program:
#include#include#include#include#include#include#include#include
暂时没有评论,来抢沙发吧~