算法思路
根据题意 就是求删除图中的一个点使得图中的连通块数目最大,并求出这个最大值。
如果这个图是一个树的话啊,那么可以用dfs求解O(N)但是是一个图可能存在环用dfs会相当麻烦,因此利用割点来求会方便很多。对于整个图来说假如有cnt个连通块,如果一个连通块i不存在割点,那么最大值就是cnt + 1, 如果连通块存在割点,那么最大值就是cnt - 1 + x(删除割点剩余的连通块数目 + x本身算一个点);
void tarjon(int u)
{
dfn[u] = low[u] = ++ timestamp; //时间戳
int cnt = 0; // 记录u下面有几个连通块
for(int i = h[u]; ~i; i = ne[i])
{
int j = e[i];
if(!dfn[j])
{
tarjon(j);
low[u] = min(low[u], low[j]);
if(dfn[u] <= low[j])cnt ++; //如果满足条件那么u是割点,记录u下面连接几个连通块
}
else low[u] = min(low[u], dfn[j]); // 更新low[u];
}
if(root != u)cnt ++; // 如果u不是根节点 再把u的父节点的连通块加上
ans = max(ans, cnt); // 最后取一个最大值
}
这个地方和求割边不一样没有考虑 儿子->父亲这条边, low[j]不可能大于dfn[u]吧