1. 程式人生 > >圖論演算法的數學模型

圖論演算法的數學模型

目錄

  • 圖論演算法的數學模型
    • 引入:最短路的數學形式
    • 最小割的數學形式
    • 一些沒用的總結

圖論演算法的數學模型

今天聽敦敦敦的課總結一下...

前置芝士:網路流,最小割

引入:最短路的數學形式

鬆弛操作:

對於一條邊\((u,v,w)\),\(\text {if}~(dis_u+w(u,v)<dis_v)~\text{then}~dis_v=dis_u+w(u,v)\)

所以對於求出來的dis,有\(dis_v\leq dis_u+w(u,v)\)對吧。。。

那麼這和差分約束中\(x_i-x_j\leq a_k\)是對應的,就可以從\(~j~\)連到\(~i~\)一條權值為\(~a_k~\)的邊
這也給了我們一個啟發:如果能把要求的貢獻/條件轉化為圖論演算法要求的形式,數學問題也可以解決

最小割的數學形式

考慮對於\(~01~\)變數\(~x~\),令\(x=0\)則與源點聯通,\(x=1\)則與匯點聯通

考慮邊\((S,x,a)\),即從源點向\(x\)連了流量為\(a\)的邊對最小割的貢獻
那麼僅當\(~x~\)連與匯點聯通時才能算把這條邊割掉的貢獻,此時\(x=1\)

那麼就可以簡單地把答案表示為\(a*x\)

同樣地,對於邊\((x,T,a)\),答案即為\(a*(1-x)\)

最後考慮邊\((x,y,a)\),注意是有向邊
那麼這條邊要被割掉僅當\(x\)與源點聯通,\(y\)與匯點聯通,貢獻即為\(a(1-x)y\)

求最小割的本質就是給x賦值對吧
那麼我們把要求的貢獻表示成這三種形式,不就可以通過最小割算出最小的貢獻了?
(最大割是np問題~)

來看一道例題吧:

ZROJ1209

放心你們找不到

說下題意:

有一個 \(n×m\) 的方格,一開始所有格子都是白色的,你的最終目的是把方格塗成你想要的顏色

你有三種刷的方法:

  • 橫著刷連續的 \(k\) 格,代價是 \(ak+b\)
  • 豎著刷連續的 \(k\) 格,代價是 \(ak+b\)
  • 只刷某個格子,代價是 \(c\)

每個格子的顏色是最後刷它的那個刷子的顏色,但是有以下幾個限制:

  • 每個格子最多隻能被刷兩次,無論這些刷子是否同色
  • 每個格子不能先刷白色刷子再刷黑色刷子,因為白色染料比較特殊,這會導致格子變成灰色,但是你可以先刷黑色刷子再刷白色刷子,也可以在一開始格子是初始顏色白色時刷黑色刷子

現在你需要求出,刷出指定顏色的最小代價

有個結論:不會被橫刷子塗兩次,這樣不是白給嗎

因為最開始都是白的,我們考慮先刷黑的,再刷白的,最後刷單點,這樣一定最優

設\(bh[x][y]\)表示 (x,y)是否被橫著的黑刷子刷了,\(wv[x][y]\) 表示是否被豎著的白刷子刷了
然後設\(\text{_bv[x][y]}\)表示1-(x,y)是否被豎著的黑刷子刷了,\(\text{_wh[x][y]}\)表示是否被橫著的白刷子刷了
這樣設是為了表示答案方便,好用最小割求解

考慮橫豎刷子的代價\(ak+b\) ,可以把a攤到每個格子上,b算到最後一個格子
那麼橫著的黑刷子對每個點的貢獻就是\(bh[x][y]*a+b*bh[x][y]*(1-bh[x][y+1])\)
其他的同理,顯然符合最小割的貢獻形式

考慮單點的代價,被單點修改僅當沒有被刷子刷過
黑格子貢獻:\(c*(1-bh[x][y])*(\text{_bv[x][y]})\)
又因為不能被白的刷過,貢獻\(inf*wv[x][y]+inf*(1-\text{_wh[x][y]})\)

那麼白格子單點貢獻:之前塗了黑但沒被塗白
\(c*bh[x][y]*(1-wv[x][y])+x*(1-\text{_bv[x][y]})*\text{_wh[x][y]}\)
而且不能被黑刷子刷兩次:\(inf*bh[x][y]*\text{(1-_bv[x][y])}\)

然後對應連點,求最小割,就做完了

一些沒用的總結

所以對於一些難抽象出圖論模型的最小割題,可以轉化成數學模型做,具體就是設設變數然後看看形式對不對應,變數可以設兩種形式

比如有一道著名的文理分科題,你想想不就是設每個點選文還是選理,二分圖染色設變數為x或1-x,貢獻分別就是\(ax,a(1-x)\),組合的貢獻就是\(c(x)(1-y),c(1-x)y\)這樣討論