2009年7月16日 星期四

UVa 11504 Dominos

題目大意就是給出塊骨牌,個關係,每個關係以x y表示「如果骨牌x倒了,骨牌y也會倒下」。
問最少要推多少塊骨牌才會讓所有骨牌倒下。
最初蠢蠢的以為只求離散集的個數便成,結果沒留意到x y不代表y x,所以離散集會誤以為兩者關係相等,必然出錯。

細心留意,可以兩個觀察。

(1) 如果存在x使得沒有z x的話,我們必須推x。(Topological Sort即便如此)
(2) 若果有一個群組中每一塊骨牌都可以直接或間接以關係把其餘所有骨牌推下,則只需推其一塊便等於把群組中的每塊骨牌推一下,省力省時。

(2)的對群組的定義便正正是強連通塊(Strongly Connected Components)的詮釋。因為「推一塊便等於推其他塊」的想法下,我們不妨把這個塊縮成一點,並把當中骨牌成員的出入塊的邊保留。結合(1)的想法,毋需做拓撲排序,直接計算入邊為零的點(若未屬任何塊,當然它自己也可以成一塊)或塊即成。

沒有留言: