2012年3月28日 星期三

tioj 1684 圓桌武士

題目:給你一個無向圖,尋找不存在奇環中點的數量

想到環就想到BCC,你可以確定找到若兩個點不在同一BCC中,則他們不會在同一個環裡
但是這題比較麻煩,因為這題是邊的BCC,你必須找到AP,並得到這個BCC的邊集合。
 找BCC很簡單,DFS出去,如果往下走不能走到比自己高的點,這個點就是一個AP,

但比較麻煩的是要怎麼找BCC的邊集合,我查網路看到的方法是開一個Stack
把走了的邊加進去,如果碰到一個割點,就開始拿出裡面的邊,直到那個邊還有這個割點。

不太確定為什麼這樣是對的,但是大概有點理由,因為這是顆DFS樹,你一個邊一個邊加
這樣邊就會是待在裡面,除非已經被拿出來了,而被拿出來就代表找到了一個AP
那麼那些被拿出的邊也不可能會在後來的BCC當中,所以感覺上合情合理~

至於為什麼存點是不行的?(我原本就是寫找點集合)那是因為有些割點是不能拔掉的
但有些卻必須要拔掉,你不知道要拔還是不要拔,所以那樣寫是不好的。

當你找的一個BCC 後,你就要來判斷他裡頭有沒有人在奇環裡,這裡有個神祕的關係:
 如果這整個BCC是一個大奇環,這裡頭所有的點都在奇環當中。
但若這整個BCC是一個大偶環,若其中有一個小奇環,則其餘的點必定為奇數點,且仍形成環,故若其中有一奇環,則BCC的所有點都位於奇環中。

 最後就是要怎麼判斷他是否在奇環在裡頭,有一個很不錯的辦法,就是把點染色,每個有相互連接的點要連成不同的顏色,如果找到有一已著過色,相連且顏色與己相同的點,則這BCC中便有奇環。

 http://codepad.org/1Jnw5MbT

沒有留言:

張貼留言