洛谷3388 【模板】割点(割顶)

来源:互联网 发布:linux没有网卡配置文件 编辑:程序博客网 时间:2024/05/22 17:30

前言

蒟蒻刚学Tarjan求割点,于是就把这道题给敲了,也算是模板吧。。。
依旧把主要思路放在这里,希望能帮助大家更好的理解

题目描述

给出一个n个点,m条边的无向图,求图的割点。(对,就是这么短)
传送门

算法

果断用Tarjan。
我们需要两个很关键的数组:
low[i] : 表示从i点出发能直接到达的所有节点中编号最小的。

dfn[i] :i节点的DFS编号,类似于时间戳。

那么如何求割点呢?

首先,对图DFS,计算low值;
然后判断割点。

那么如何判断一个点是不是割点呢?
对于节点i,如果i=1(即i是根节点),那么如果2,则其为割点;否则,若

low[s]dfn[i]
(s为i的任一个子节点),则i为割点。

那么还剩下最后一个问题:
low值如何计算?
对于任意节点i,设其任意子节点为s,父节点为f,则有公式:

low[v]=min(dfn[v],low[s],dfn[f])

(LxTex真的有毒。。。)

这样,整个框架就出来了。

注意到本题数据范围较大,记得开邻接表

代码

(模板的代码就不给了、、、)
(其实是因为我只会敲邻接矩阵的版本、、、)

后记

其实我一开始学割点的时候还不知道这就是Tarjan。。。。。
求出了割点,也就可以借助栈来输出强联通分量、
这个以后再发博客吧、、、(又埋下一个坑)