又開始在數學上面慣有的毛病,就是經常較真。。
然後就一定要搞明白爲什麼。。然後最近學了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就是一個強聯通分量了嘛。。
好了發瘋完畢,,