1. 程式人生 > >12.15 省選訓練總結

12.15 省選訓練總結

目錄

完成情況 題目 出處
GGS-DDU HDU 4966
Journey CDOJ 92
Network POJ 1144
朋友圈 BZOJ 2744 [HEOI 2012]
放箱子 CDOJ 1432
Harry Potter and the Forbidden Forest HDU 3987
度度熊的交易計劃 HDU 6118

最小樹形圖

  • 定義:
    在一個有向圖中,欽定一個根節點,然後選取一些邊,然後使得根節點可以達到任意一個節點,就是廣義的最小生成樹。

  • 演算法:朱劉演算法
    首先判斷圖的連通性,如果不連通,就肯定沒解。
    如果有,為每一個點選取一個權值最小的入邊,暫時當做選擇它。
    選完之後可能有環,我們縮一下環,然後對於一個環,每當有一個環上連一條邊的時候,將環上的一個點拆了,然後把邊連上去,這樣子,可以保證必定變成一個樹。

例題

  • Hdu 4966
    先把課的等級離散一下,然後每一個點向等級低的點來連一條0的邊,這樣子表示如果學會這個等級,那麼小的等級也會學會,然後把a向b按照題意連一條邊,這樣搞樹形圖就可以啦。

TARJAN

tarjan演算法的核心是dfnlow陣列,一個是表示訪問到某一個節點的時間戳,一個是這個點能訪問的點的最小的時間戳,這樣子,如果有環的話,那麼就可以直接更新了。但是我們要注意一些細節,比如判斷這個點有沒有被訪問過是用他的d

fn來算,而不是vis陣列。vis的意義是訪問過的,並且這個時候還在棧中的點。還有就是如果用stl的棧,不要忘了最後彈一下當前點。
藉此演算法,我們可以求SCC,無向圖的割點和割邊(橋),那麼以割點為例,割點的判斷是他的後代沒有能指向他的父親的邊,這個也明顯可以用low這些來算。這樣子,橋的話類似,就是看連線的兩個點。

LCA

方法有很多,RMQtarjan等等都可以,具體的略去。

例題

  • Cdoj 92
    這種迂腐的題,當然可以直接在仙人掌上跑最短路,但是不用這麼麻煩,因為我們可以這樣:新的最短路要麼是原路,要麼是走到新的邊上的路徑,我們可以直接算出這幾個點的距離,比較一下就好了。

無向圖求割頂

原理

(見之前)使用tarjan,如果有這個點能到的點的low小於其dfn,說明他不是割頂,反之,如果不小於,那麼就是一個割頂。

例題

Poj 1144
裸題……

次長路

定義:

大於最短路的最小路徑。

方法有兩種:

1.dijkstral的時候再紀錄一下次長路的長度,此時次長路轉移什麼的就可以直接列舉某一條邊轉移,這樣子還可以順便記錄下條數。
2.跑完一次最短路之後,列舉一條邊的兩個端點就可以啦。