mysql最小費用最大流問題 最小費用最大流

2021-10-20 01:40:25 字數 1896 閱讀 1283

最小費用最大流 修改的dijkstra+ford-fulksonff演算法

修改的dijkstra其實和johnson演算法的思想是一致的。

乙個求最小費用最大流的樸素演算法是這樣的:1求最小費用增廣路2判斷是否存在增廣路,否的話演算法終止。3增加增廣路上邊的流量4在增廣路上新增必要的逆向負權邊5goto1因為負權邊的存在,求最小費用增廣路就不可以用dijkstra演算法。當然,我們可以用bellman-ford演算法,可是這樣的話求一次最短路的時間代價就是o(e*n),e是邊數,n是頂點數。代價大了點,如果能用dijkstra演算法就好了。利用johnson演算法的思想,這是可以做到的。

第一次求最短路可以用dijkstra演算法(如果一開始就有負權邊,那就用bellman-ford演算法,這沒關係),求出源點到所有點的距離,嗯,我說的距離是指路徑上邊的費用之和的最小值。注意,要求出到所有點的距離,而不是求出到匯點的距離就完事了。

假設有一條邊u->v,源點到u的距離是d[u],到v的距離是d[v],邊的費用(權值)是w(u,v)。很顯然,d[u]+w(u,v)>=d[v],不然的話,你會發現一條更好的路徑從源點到v。問題是,什麼時候取等呢?當u->v在v的最優路徑上,範圍說小一點,當u->v在從源點到匯點的最優路徑,即最小費用增廣路上。

好的,如果u->v被你增載了,你要開始添負權邊v->u了,權值取負,就是-w(u,v)。負權就是討厭,是正的就好了,dijkstra演算法就可以再用了。怎麼辦呢,把負權邊加個權值,讓它非負。要加多少呢,d[v]-d[u]。當然不能只加一條邊,對所有邊,無論原有的還是新添的,按這個規則加,構造乙個新的圖:

對邊a->b,新的邊權w'(a,b)=w(a,b)+d[a]-d[b]現在來看看你的傑作:

對原來的邊u->v, w'(u,v)=w(u,v)+d[u]-d[v]: 記得麼d[u]+w(u,v)>=d[v], 所以 w'(u,v)>=0對新加的負權邊v->u, w'(v,u)=w(v,u)+d[v]-d[u]=-w(u,v)+d[v]-d[u]: 記得麼d[u]+w(u,v)==d[v],這裡可是取等號的,所以w'(v,u)==0哈哈,這下所有邊又是非負的了。

可是,問題是,為啥不每個邊加個足夠大的正數,這樣不是所有邊也都是正的了麼。仔細想想,邊權為啥要為正,不就是為了求源點到匯點的最短路方便麼,可是,都加大正數的話,你求出的最短路和原來圖的最短路能一致麼,不能,為啥,畫個三角形,自己想想。可是,我的方法就能一致麼,能。我證明給你看。

假設從源點s到匯點t有一條路徑s->a->b->c->d

w(s,a)+w(a,b)+w(b,c)+

在新圖中的路徑為

w'(s,a)+w'(a,b)+w'(b,c)+

展開來就是

w(s,a)+d[a]-d[s]+w(a,b)+d[b]-d[a]+w(c,d)+d[d]-d[b]+

消阿消,d[a]和-d[a],d[b]和-d[b]

w(s,a)+w(a,b)+w(b,c)++d[t]-d[s]

噢,不就比原圖中多d[t]-d[s]麼(其實d[s]==0)。這可是對所有s到t的路徑都成立的,既然所有路徑,在新圖中的權值都比在原圖中的權值多了d[t],那麼,新圖的最短路,也就對應原圖的最短路,只不過路徑長度多了d[t],這不僅對t成立,對所有節點u都成立,只不過新圖中到u的最短路長度比原圖多了d[u]。

好,用dijkstra演算法,第二次求出最短路。然後求出新的d』[u],然後新增新的邊,然後準備第三次的dijkstra演算法。。。為什麼第二次可以這樣做,第三次還可以這樣做,第三次的原圖可能有很多負權邊啊?我可沒說過w(u,v)>=0這樣的限制,所以,即使原圖有負權邊還是可以這樣做的。

好了,第一次dijkstra演算法(或者bellman-ford演算法,如果有負權邊的話,只用一次,不會成為瓶頸的),然後每次求最小增廣路用一次修改的dijkstra演算法。這個演算法求最小費用最大流複雜度是o(m*n*n), m是最大流量,或者是求增廣路次數的上界。最後,如果用這個演算法來求最優匹配問題,複雜度是o(n^3)的。

mysql最小費用最大流問題 最小費用最大流問題

複雜網路中,單源單點的最小費用最大流演算法 mcmf 應用廣泛。在實際網路問題中,不僅考慮從 vs到 vt的流量最大,還要考慮可行流在網路傳送過程中的費用問題,這就是網路的最小費用最大流問題。最小費用最大流問題的一般提法 已知容量網路 d v a c 每條弧 vi,vj 除了已給出容量 cij 外,...

mysql最小費用最大流問題 最小費用最大流問題

最小費用最大流就是在原來求最大流的基礎上,假設每條邊還有乙個單位流量所需要的費用,因為最小費用的出現,原本的平行邊變得有意義,並且允許反向增廣,基本上就是將原本bfs改為進行一次bellmanford演算法尋找最短路徑,只要初始流是該流量下的最小費用可行流,每次增廣後的新流都是新流量下的最小費用流。...

最小費用最大流問題

網路流相關知識參考 出處 優you 大致題意 給定乙個n m的地圖,地圖上有若干個man和house,且man與house的數量一致。man每移動一格需花費 1 即單位費用 單位距離 一間house只能入住乙個man。現在要求所有的man都入住house,求最小費用。解題思路 費用流問題。構圖 把m...