又开始在数学上面惯有的毛病,就是经常较真。。
然后就一定要搞明白为什么。。然后最近学了Tarjan和求割项。
自己yy了证法。。
力求把自己的思想过程都写出来
希望不要再犯神经病了。。
割项证法:
就是利用无向图的DFS树。。
很明显在一棵DFS树中,一个点是割项的条件只能是它的后代不能有反向边连到这个点的前面去(当然可以连到这个点它自己)
所以就维护一个low数组,代表一个点和它的后代能连到的最早的边
然后对于一个点,如果它的几个儿子的low都大于等于它的DFN它就一定是割项了嘛。。
[疯言疯语]
(一)
low[u]=min(low[u],dfn[v]),为什么这里不能用low[v]呢。。
医生给出的治疗建议:
嗯。。如果说这个v指向的是那个割项之前或者割项之后用low[v]来代替dfn[v]都是没有问题的。。
但是如果v是割项
那么如果v在之前正好指向过一个之前的点,即low[v]<dfn[v]
这个时候更新low[u]
如果用low[V]来更新,那么low[u]就会小于dfn[v],那么回去判断割项的时候就会判断它不是一个割项
如果用dfn[v]来更新,那么Low[u]就是等于dfn[v],那么回去判断割项的时候就会判断它是一个割项。
嗯举个例子
比如有这样一个图
有边{1,2},{2,3},{3,1},{3,4},{3,5},{4,5}
脑补一下就明白了
(二)
为什么在判断v<>father呢。。
的确,不判断这个y<>father是可以的
但是为了和求桥统一(即求桥的时候是不可以的),所以就判断一下了。
Tarjan证法
嗯接下俩讲讲Tarjan
首先我们先要证明一个东西。。
就是一个强联通分量,被DFS到的第一个点,一定是low=dfn的。
假设low<>dfn ,那么low<dfn
这个时候说明它的后代可以连到更前面的点
那我们发现后代可以走到前面的,前面的也可以到后代
那么前面的点一直到后代就是同一个强联通分量里的。
那么那个前面的就是第一个DFS到的点嘛。。
然后就是为什么要low[u]=min(low[u],dfn[v]);
其实在Tarjan里,dfn[v]和low[v]是一样的。
不过为了和割项统一。。所以就这么写了。。
最后一个就是为什么还要判断一次ins[v]
如果这个点ins[v]=false。那么这个点就一定是已经被弹过了,就是low[v]>LCA(u,v)[具体为什么自己yy一下?]
那么u到v,v却不一定能到u,那么u,v就不是一个强联通分量
但如果ins[v]=true,那么这个点就没有被弹过,那么low[v]<=LCA(u,v),
所以u可以到v,由low可得v可到LCA(u,v)之上的点,然后再下来到u,所以u,v就是一个强联通分量了嘛。。
好了发疯完毕,,