废话
关于割点,请看前面一篇文章。
定义
度娘的解释:假设有连通图G,e是其中一条边,如果G-e是不连通的,则边e是图G的一条割边。此情形下,G-e必包含两个连通分支。
换句话说,就是一个连通图的必经之路(割点是必经之点)。
思路
首先,求桥要用Tarjin,所以dfn和low数组还是要有的。
然后是判断一条边是桥的条件:
当一条边是树枝边(即从父亲k到儿子p去的边),然后low[p]>=dfn[k],即p不通过k而能到达的最小值(即从p的子树走)比k要大,那么这条边就是桥。
(很简单是不是)
其他和tarjin一样,于是就有下面的代码了。
void tarjin(int k,int fa)
{
low[k]=dfn[k]=++tot;
for(int i=head[k]; i; i=a[i].nxt)
if(a[i].to==fa) continue;
else if(!dfn[a[i].to])
{
tarjin(a[i].to,k),low[k]=min(low[k],low[a[i].to]);
if(low[a[i].to]>dfn[k]) ans++;
}
else low[k]=min(low[k],dfn[a[i].to]);
}
小结
求桥用Tarjin,判断条件是low[a[i].to]>dfn[k],其余和tarjin一样,不变。这个Tarjin的模板代码还是很常用的。
完结撒花!!!
别忘了点赞,关注,谢谢!!