大量參考集訓隊爺的部落格link
這個演算法是用來解決最小內向森林問題的,可以解出有\(k\)棵樹時的最優解,時間複雜度是\(o(mlogm)\)
注意到圖的生成內向森林是乙個擬陣
所以我們可以由考慮從\(i+1\)棵內向樹推出\(i\)棵內向樹時的答案,每次貪心地擴充套件最小的邊
演算法思路大致如下:
1、用堆維護當前所有內向樹及其擴充套件代價。初始內向樹是\(n\)個點,每個點的代價是其最小出邊。
2、選擇當前擴充套件代價最小的內向樹,如果沒有樹可以擴充套件,則退出。
否則進行擴充套件(即從根連其最小出邊到其他樹),記錄答案。
3、更新當前被修改的內向樹的「擴充套件代價」。
具體擴充套件的方式就是不停地加入堆頂的邊如果不成環就退出,否則就合併兩個堆,在合併之前注意維護連上那條邊的代價
然後返回2
模板最小樹形圖
hdu 2020 multi-university training contest 4 joyful party
建圖發現是最小內向森林
但是發現他一條邊連向的點太多了,但是線段樹優化建圖不現實
於是考慮寫個線段樹維護每個環上有哪些點
每次找出一條邊中能到達的最小的點進行計算
注意到每一次選點都至少等效地會減少原圖中的乙個點(不管是連邊擴充套件樹還是把幾棵樹連成環)
所以複雜度是\(o((m+n)logm)\)
code
演算法學習筆記 主席樹
出題出掛了,來好好學主席樹了 線段樹沒了 對於使用線段樹,我們可以較好地解決 帶修改的全域性第k大 或小 問題 但是對於某個區間進行求第k大 或小 操作就不是那麼容易了。可持久化一詞在資料結構中十分常見。可持久化 的意思就是 帶有歷史版本的 資料結構。而在我們所接觸到的基本資料結構中 如陣列 並查集...
演算法學習筆記 線段樹
在樹狀陣列那篇部落格中,留下了乙個坑 區間修改區間查詢 樹狀陣列部落格傳送門 今天我們就要來解決這個問題 都很簡單 線段樹是一種可以較快維護滿足區間可加性區間資訊 如 區間和,區間積,區間最大最小等 的資料結構,其基本思想就是二分。注 區間可加性指一些可以通過子區間資訊合併維護的資訊,如區間最大就可...
演算法學習筆記 廣度優先搜尋 1
兩個步驟 1.使用圖來建立問題模型 2.使用廣度優先搜尋解決問題 圖用於模擬一組連線。圖由節點和邊組成。直接相連的節點稱為鄰居。當圖是有向圖的時候a b a指向b 那麼b是a的鄰居,a不是b的鄰居。當圖是無向圖的時候a b,他們互為鄰居。1 廣度優先搜尋是一種用於圖的查詢演算法。2 第一類問題 從節...