1. 程式人生 > >最小費用最大流 zkw演算法

最小費用最大流 zkw演算法

這裡使用的是連續最短路演算法。最短路演算法?為什麼程式裡沒有 SPFA?Dijkstra?且慢,先讓我們回顧一下圖論中最短路演算法中的距離標號。定義D_i為點i的距離標號,任何一個最短路演算法保證,演算法結束時對任意指向頂點i、從頂點j出發的邊滿足D_i /le D_j + c_{ij}(條件1),且對於每個i存在一個j使得等號成立(條件2)。換句話說,任何一個滿足以上兩個條件的演算法都可以叫做最短路,而不僅僅是 SPFA、Dijkstra,演算法結束後,恰在最短路上的邊滿足D_i = D_j + c_{ij}

  在最小費用流的計算中,我們每次沿D_i = D_j + c_{ij}的路徑增廣後都不會破壞條件 1,但是可能破壞了條件 2。不滿足條件 2 的後果是什麼呢?使我們找不到每條邊都滿足D_i = D_j + c_{ij}新的增廣路。只好每次增廣後使用 Dijkstra,SPFA 等等演算法重新計算新的滿足條件 2 的距離標號。這無疑是一種浪費。KM 演算法中我們可以修改不斷修改可行頂標,不斷擴大可行子圖,這裡也同樣,我們可以在始終滿足條件 1 的距離標號上不斷修改,直到可以繼續增廣(滿足條件 2)。

  回顧一下 KM 演算法修改頂標的方法。根據最後一次尋找交錯路不成功的 DFS,找到
d = /mathop {/min }/limits_{i /in V,j /notin V} /left/{ { - w_{ij} + A_i + B_j } /right/}
,左邊的點增加d,右邊的點減少d。這裡也一樣,根據最後一次尋找增廣路不成功的 DFS,找到d = /mathop {/min }/limits_{i /in V,j /notin V,u_{ij} > 0} /left/{ {c_{ij} - D_i + D_j } /right/},所有訪問過的點距離標號增加d。可以證明,這樣不會破壞性質 1,而且至少有一條新的邊進入了D_i = D_j + c_{ij}的子圖。

  演算法的步驟就是初始標號設為0,不斷增廣,如果不能增廣,修改標號繼續增廣,直到徹底不能增廣:源點的標號已經被加到了+ /infty

  這樣我們得到了一個簡單的演算法,只需要增廣,改標號,各自只有 7 行,不需要 BFS,佇列,SPFA,程式設計複雜度很低。由於實際的增廣都是沿最短路進行的,所以理論時間複雜度與使用 SPFA 等等方法的連續最短路演算法一致,但節省了 SPFA 或者 Dijkstra 的運算時間。實測發現這種演算法常數很小,速度較快,employee 這道題所有資料加在一起耗時都在 2s 之內。由於沒有找到參考程式,與 SPFA 實現的速度比較大家可以自己評測。

相關推薦

費用 zkw演算法

這裡使用的是連續最短路演算法。最短路演算法?為什麼程式裡沒有 SPFA?Dijkstra?且慢,先讓我們回顧一下圖論中最短路演算法中的距離標號。定義為點的距離標號,任何一個最短路演算法保證,演算法結束時對任意指向頂點、從頂點出發的邊滿足(條件1),且對於每個存在一個使得等號成立(條件2)。換句話說,任何一個滿

#zkw費用費用#洛谷 4012 codevs 1917 ssl 2620 深海機器人問題

題目大意 在一個平面直角座標系中,機器人只能往右和上採集標本,每個格點都有不同的價值,現在若干個機器人從某點出發目的地為某點,問採集到的最大價值 分析 其實這道題類比於K取方格數,容易建出這樣一張圖 然後跑一遍最大費用最大流就可以了,但是我把費用取反,跑的是最小費用最

poj-2195 費用or二分圖km演算法

Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26221  

HDU 4744 Starloop System(ZKW費用

打完才發現,這不就是我一直打的SPFA+多路增廣+vis防走環嗎。。。。。 AC Code: #include<bits/stdc++.h> #define maxn 305 #define maxm 200005 #define inf 0x3f3f3f3f usi

POJ 2195-Going Home(KM演算法/費用演算法

Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21730 Accepted: 10990 Description On a grid map there are n

【圖論】之EK演算法與Dinic演算法費用

最大流: 給出一張網路圖,並指定源點和終點,每條邊都有它的容量,起點有著無限的流量,求從源點到經過的所有路徑的最終到達匯點的最大流量和。對於同一個節點,流入的流量之和和流出的流量之和相同,即假如結點1有12流量流入結點2,結點2分別有8流量流入結點3,4流量流入結點4,這種

[CODEVS1915] 分配問題(費用

min inline == getc digi empty getchar() clu spfa 傳送門 腦殘題 建圖都懶得說了 ——代碼 1 #include <queue> 2 #include

[luoguP2045] 方格取數加強版(費用

col pid opened empty spl amp turn define aps 傳送門 水題 ——代碼 1 #include <queue> 2 #include <cstdio>

UVA1658 Admiral 拆點法解決結點容量(路徑不能有公共點,容量為1的時候) 費用

ear ace == void for include () size max /** 題目:UVA1658 Admiral 鏈接:https://vjudge.net/problem/UVA-1658 題意:lrj入門經典P375 求從s到t的兩條不相交(除了s和t

poj3680 Intervals 區間k覆蓋問題 費用 建圖巧妙

全部 cstring ras 如果 cos printf als lld map /** 題目:poj3680 Intervals 區間k覆蓋問題 最小費用最大流 建圖巧妙 鏈接:http://poj.org/problem?id=3680 題意:給定n個區間,每個區間(

hdu4106 區間k覆蓋問題(連續m個數,多選k個數) 費用 建圖巧妙

編號 blog .cn cstring 題意 acm 不同 本質 span /** 題目:hdu4106 區間k覆蓋問題(連續m個數,最多選k個數) 最小費用最大流 建圖巧妙 鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=410

poj3422 拆點法x->x'建立兩條邊+費用

algorithm printf eof class clas als typedef 建圖 get /** 題目:poj3422 拆點法+最小費用最大流 鏈接:http://poj.org/problem?id=3422 題意:給定n*n的矩陣,含有元素值,初始sum=

費用

dinic min man 多個 轉化 pan 多少 最短路 += 一、問題描述 最小費用最大流: 在最大流有多組解時,給每條邊在附上一個單位費用的量,問在滿足最大流時的最小費用是多少? 二、算法描述 思想: 給出一個容量網絡,那他的最大流一定是一個定值(即使是有多

[洛谷3381]【模板】費用

main 最小費用最大流 spf 最大流模板題 rem digi span mem spfa 思路:最小費用最大流模板題。用EdmondsKarp,增廣時使用SPFA求最短路。 1 #include<queue> 2 #include<cstd

POJ 3686.The Windy's 費用

mission event tac prev 思路 n) scrip display table The Windy‘s Time Limit: 5000MS Memory Limit: 65536K Total Submissions:

[洛谷P3381]【模板】費用

code main sdi span printf fast tdi nbsp optimize 題目大意:給出一個網絡圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網絡最大流和在最大流情況下的最小費用。 解題思路:最小費用最大流模板。雖說此題最後兩個點

P3381 【模板】費用

false == blog content space cost pre png 單位 P3381 【模板】最小費用最大流 題目描述 如題,給出一個網絡圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網絡最大流和在最大流情

luogo_3381【模板】費用

int names push its als llc eof cap pty #include<bits/stdc++.h>using namespace std;#define MAXM 500010#define MAXN 5010#define INF 1

Farm Tour(費用模板)

arc cost -c fields ros lap view which accept Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18150

POJ - 2195 費用

!= cond print false char air double 題意 memset 題意:每個人到每個房子一一對應,費用為曼哈頓距離,求最小的費用 題解:單源點匯點最小費用最大流,每個人和房子對於建邊 #include<map> #incl