1. 程式人生 > >最大權閉合子圖學習筆記

最大權閉合子圖學習筆記

ghj1222又更新部落格了。儘管不能做到高產似母豬,但是最近又開始想更新了。

學網路流這麼長時間了,才知道有最大權閉合子圖這種科技,我真是太菜了。

什麼是最大權閉合子圖?

給定一個DAG(好像是DAG??大霧),每個點有權值(可正可負),要求欽定圖中的一些點,滿足:

  1. 欽定點所有後繼點都被欽定
  2. 所有點的點權和最大

求最大點權。

解法:考慮網路流建圖。

  1. 在原圖中給所有邊賦容量inf。
  2. 新建src,對於所有點權為正的點,從src到該點連線容量為該點點權的邊。
  3. 新建dest,對於所有點權為負的點,從該點到dest連線容量為該點點權絕對值的邊。

然後從src到dest跑最大流,答案為所有正點權的和減去最大流。

原理:根據最大流最小割定理,我們跑出的最大流就相當於最小割。

考慮從src到dest的某一條路徑。路徑的形式一定是由src到某個正權值點,再到某個負權值點,再到dest。中途容量為inf的邊在最小割中肯定是不會被切斷的,所以只有兩種情況:

  1. 切斷src到正權點的邊。統計答案時候我們一開始加上了所有正權點的邊的流量,在減去最小割的時候又減去了這個流量,相當於不選這個正權點。
  2. 切斷負權點到dest之間的邊,即選這個正權點獲得利益的同時在最小割中又包含了這個負權點的流量,減去最小割相當於選擇這個正權點而導致選擇負權點帶來的損失。

其實網路流模型不難理解,稍微動動腦即可。

例題:[SHOI2017]壽司餐廳

題意特別噁心。我們對於某個區間[l,r]建立一個點,發現我們選擇[l,r]就必須選擇[l+1,r]和[l,r-1],選擇區間就必須選擇所有壽司(從而購買之),選擇壽司就得選擇那個壽司對應的mx^2

所以對於滿足l<r的[l,r]向[l+1,r]和[l,r-1]連邊,點權即為輸入值;
對於[i,i]向壽司i連邊,[i,i]點權為輸入值,壽司i的點權為壽司i花費,注意是負的;
對於壽司i再向a[i]代號連邊,對於某個代號j,點權為-mj^2

然後對於這個圖跑最大權閉合子圖即可。程式碼太醜,不放了。