總結 拓撲排序

2022-01-29 03:27:26 字數 1609 閱讀 7998

dm_vincent的專欄

某推酷總結:

最近花了一點點時間學了拓撲排序,感覺到圖論真是神奇。

總的來說,拓撲排序的題還是有一定的靈活度的,除去一些比較水的題,很容易跟其他演算法或者資料結構混在一起,一下子難度就上去了,也從單一的模板的題變為了多重模板題或者智力題。

拓撲排序比較好理解,就是建立有向圖,每次取入度為0的點,去除掉與他有關的邊,然後再去除。最後形成了乙個拓撲序。

**實現,可以用鄰接矩陣也可以用鄰接表,但是如果是稀疏圖而且圖又大,鄰接矩陣可能會浪費一些時間。

我比較喜歡用鄰接表寫,因為**寫起來不容易出錯,用乙個佇列儲存當前所有入度為0的點。

toposort開始,先找出所有入度為0的點,全部push到佇列q中,這些點所有的入度-1,就不再需要考慮了。

接著,開始while(!q.empty()),注意由於q中儲存的是入度為0的點。一旦q.size()==0,那麼也就是說當前圖出現了環,迴圈將直接跳出。

這時可以設定乙個變數cnt統計訪問到的點的數量,一旦cnt!=n,也就是說沒有完全訪問,用這個方法可以捕捉到錯誤。

一旦出現環,說明單位之間的關係產生了矛盾,比如:

這些都是環。

有些題可能除了需要判斷矛盾之外,還需要判斷是否可以確定,也就是是否唯一。

只需要在while中加乙個判斷是否q.size()>1,如果大於1,說明在某一次取入度為0的時候取到了多個,這必然產生多種結果。

這只是一些最基礎的總結,很多入門的水題只需要這些知識就能解決,但是大部分的題目中,拓撲排序只佔了一小部分,根本不可能出一題純拓撲排序的題目。

下面是一些題目,自己也在做,不斷更新,部分題目點選題號有題解:

加粗代表重要,下劃線代表只看沒寫。

hdu 1285 2094 2647 3342

poj 2367

上面的都是很水的題,大部分題都是秒a,用來練手和測試用。

hdu 1811 與並查集縮點配合求解。

poj 1094 需要繞一繞判斷。

poj 3687 這題比較重要,做法很巧,字典序最小。

poj 1128 找出只有兩個錶能相互影響的點,然後在輸入的表中檢視覆蓋的點建邊。

poj 1420 excel表計算,很容易看出可以拓撲的點,存在未知的值就把當前表示式和那個值建邊,跑一邊拓撲即可,但是10000kb的記憶體不知道網上大牛的(26×26×26+26×26+26)×1000的陣列不知道怎麼ac的,如果真是10000kb的話,正解應該是深搜,紫書上有類似的題。

poj 3660 這題這題不是使用拓撲排序寫的,需要確定已經完全可以確定的名次,這題想了兩天都沒出,其實只需要統計在點前和點後的可以連通的點的個數是n-1的點的數量即可。 

拓撲排序總結

拓撲排序主要的作用是可以用來判斷,當前圖中是否含有環。其主要的實現思想是,從圖中的入度為零的點開始,如果找到,就將這個點從圖中刪去,並更新與這個點相連的其他點的入度資訊,直到全部的點都被刪去,或者圖中沒有入度為零的點,如果是後一種情況,那麼證明圖中含有環。的實現具體如下 include using ...

拓撲排序總結

問題分析 怎麼說呢 拓撲排序 給我的感覺就是 一棵樹 從樹冠 往下 每次遇到 比他的小的 就把它的入度 1 就往樹下 走 然後從樹冠 找 入度為0 是就是乙個 小樹冠 其下擁有若干 小樹 小分支的入度為0 意味著到了 小樹冠的底部但著並不意味著 這就是最小值 因為 可能還有比這個數的最大入度 還大的...

python 拓撲排序 Python 拓撲排序

python 拓撲排序 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序 英語 topological sorting 每個頂點出現且只出現一次 若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。print 拓撲排序結果 g.topologicalso...