說在前面
剛剛去寫了一道SPFA+網路流的糅合題,1A了
閑著沒事幹開始翻起了status,發現有人在做水管局長,哇這不是LCT嘛!
然後回頭看了一下自己寫過的寥寥無幾的LCT的題,發現都快要忘了
於是決定來補一篇部落格,嗯就是這樣 題目
BZOJ3669傳送門
順便,BZOJ3668是一道很好玩的題,傳送門:BZOJ3668傳送門 題目大意
給一個含有N個節點和M條邊的無向圖,每條邊有兩個權值 ai,bi a_i,b_i
現在定義一條從A到B的路徑的代價為A到B的路徑上的 max(ai)+max(bi) max(a_i)+max(b_i)
詢問1到N的最小代價。 N≤50000,M≤100000 N\leq 50000,M\leq 100000 輸入輸出格式
輸入格式:
第1行包含兩個整數 N N, M M,表示無向圖共有 N N個節點, M M條邊
接下來 M M行,每行包含4個正整數 u,v,ai,bi u, v , a_i , b_i,描述第 i i條無向邊。其中 u u與 v v為該邊兩個端點的標號, ai a_i與 bi b_i的含義如題所述。 注意資料中可能包含重邊與自環
輸出格式:
輸出一行一個整數,表示答案 解法
這道題很難,me是看了題解的(逃)
正解是LCT,把邊權化為點權進行維護
這道題一條邊有兩個權值,很難用最小產生樹或者最短路之類的來跑。那麼想到先讓一維有序,在另一維上搞事。
最開始所有的點都是不聯通的。
先把所有邊按照 ai a_i從小到大排序,然後依次把邊加進圖裡。如果加邊之後,圖裡形成了環,並且環上最大的 bi b_i比當前邊大,就把那條最大的邊割掉,否則不加邊。
加完邊之後,如果 1 1號點和 N N號點聯通,那麼就用當前 ai a_i和路徑上最大的 bi b_i更新答案
關於正確性。
假設原來1和N不聯通,加了一條邊變得聯通了,那麼更新答案,正確性顯然。
如果原來1和N就聯通,並且新邊的 bi b_i比原來某一條邊小。由於 ai a_i肯定比原來所有邊都大,所以只要走這條邊,代價就一定會有