【题目大意】:
给你一个图,求割点的个数~
【题目分析】:
这题够裸了吧……刷水题果然很有快感啊……
其实要是不会割点算法还是要想想的~
那就简单总结下吧~割点的特点就是如果去掉这个点图就不连通了。这个就有一个非常经典的东西,就是WC王宏说成“塔尖”(Tarjan)的算法。(P.s.他刚说的时候我们几个都楞了,反应过来我们都冷了……)
Tarjan算法是一堆算法(我只能这么说,因为好多算法都叫Tarjan),关于连通性的几个Tarjan算法都有一个很有特点的地方,就是他都用到了一下两个数组。
dfn:这个点在dfs序列中的位置
low:经过这个点及这个点的所有儿子能追溯到的dfn最小点的dfn值~~
这样我们发现,如果发现low(儿子)>=dfn(父亲),那么这个父亲就是一个割点。(他的儿子向下找没法重新找到自己的父亲~)
当然这还是不够的,我们发现对于我们搜索的第一个点来说,他的dfn值是1,永远不会有点的low值比他大,所以我们要特判下,如果说他的真正的儿子(就是dfs的时候找到的儿子,也就是环不算)的个数大于1的话,他就是一个割点。
【代码】(这悲剧的东西怎么也跑不出0MS来~):