貨車運輸

最爱丁珰發表於2024-03-20

借這一道題目來介紹一下最小瓶頸路和Kruscal重構樹

首先本來這道題目我其實是沒看出來是最大生成樹的(因為不知道上面兩個東西),然後我想的是二分,當然也可以做,但是複雜度多一個\(log\)

對上面兩個東西的介紹見OI-wiki

下面是一些解釋

最小瓶頸路的性質的第一句話說“根據最小生成樹定義”,其實這個根據定義是出不來的,我們需要證明,而且這個證明不是簡單的反證法就可以證明成功的,要用比較複雜的反證

我們考慮某一對點\((u,v)\),在MST上其存在且僅存在一條路徑,設這條路徑的邊權的最小值為\(a\);假設在原圖中\((u,v)\)存在另一條路徑,設這條路徑的邊權的最小值為\(b\),且\(b>a\),則我們考慮這條路徑中不在MST中的邊

對這樣的一條邊,我們考慮Kruscal演算法的過程,當遍歷到這條邊的時候,我們沒有將這條邊加入Kruscal,因為這條邊的兩個端點已經存在一條路徑了,而且這條路徑上的每一條邊都是最終MST上的邊。也就是說,我們可以將我們找到的任意一條其他的非MST路徑上不是MST中的邊全部換成若干條MST上的邊,而且邊權最小值會變大(或者至少不會變差),所以最後所有邊都是MST上的邊而且答案不會更劣;由於MST上\((u,v)\)只有一條路徑,所以說這就是最優的答案

我們以上的證明過程也說明我們隨便求一個MST就好了

然後這道題目只會用到最小瓶頸路

接下來介紹一下Kruscal重構樹

定義中說“得到了一顆恰有\(n\)個葉子的二叉樹”,實際上這些葉子全部都是原圖中的點(也就是說新新增的點都不是葉子),這個用數學歸納法可以證明;“非葉子節點恰有兩個兒子”也可以用數學歸納法證明

那麼為什麼

第一個等號見上文證明;第二個等號我們來考慮Kruscal的過程

對於\((u,v)\)在MST上的路徑,我們找出其邊權最大的邊,這條邊是這條路徑中最後被新增到MST中的邊

在新增這條邊之前,\(u\)\(v\)各自在兩個連通塊中,而且這兩個連通塊都是樹,\(u\)或者\(v\)一直往上面走最終會走到各自連通塊的根節點;新增這條邊之後,我們連線了兩個連通塊(樹)的根節點,並且將這兩個根結點作為新連通塊根節點的左右兒子,所以這個時候\(u\)\(v\)各自往上面走,就會走到這個新連通塊的根節點,所以這個根節點就是兩者的LCA,且這個LCA的點權剛好是我們新增的最後一條邊的邊權,也就是路徑的最大值

我們還可以發現,最終得到的Kruscal重構樹,父親的權值一定不會低於兩個兒子的權值

相關文章