最小費用流bellman ford演算法總結

2021-07-15 21:24:05 字數 932 閱讀 4691

最小費用流問題是尋找流為f時的最小費用,普通的最大流中邊只有流量限制,而在費用流中還加上了費用,為保證過程可逆和正確性殘餘網路中的負權邊是原邊費用的相反數,求解此類問題的方法依然是貪心,我們在殘餘網路上總是沿著最短路增廣,這樣可以保證在當前流量下,取得最小的費用(權值為費用),一直貪心下去,直到f減為0,這裡有乙個問題,f能否減到0呢,答案是肯定的,考慮最大流演算法,我們總是能從0擴充套件到任意流(流不大於最大流),相應地,我們總是能從f沿著原路退到0。

以下是最小費用流的實現,因為殘餘網路中存在負權邊,所以使用bellman-ford演算法求解最短路。

#include #include #include #include #include #include #include #include #include using namespace std;

const int max_v = 1005;

const int inf = 0x3f3f3f3f;

struct edge

};vectorg[max_v];

int v;

int prevv[max_v],preve[max_v];

int dist[max_v];

void add_edge(int from,int to,int cap,int cost)

int min_cost_flow(int s,int t,int f)}}

}if(dist[t] == inf)

int d = f;

for(int v = t; v != s; v = prevv[v])

f -= d;

res += d * dist[t];

for(int v = t; v != s; v = prevv[v])

}return res;

}int main()

最小費用流

include include define maxn 61 define maxv maxn maxn 2 1 define maxe maxv 5 define oo 2147483647 define min a,b a b b a define maxq maxe using namespa...

最小費用流

int v 頂點數 vector g max v int dist max v 最短距離 int prev max v 最短路中前驅結點對應的點 int pree max v 最短路中前驅結點對應的邊 void addedge int from,int to,int cap,int cost 求從s...

最小費用流

acm模版 最小費用流 o v e f init network g g.build v,e call g.mincost s,t flow g.flow cost g.cost 注意 spfa增廣,實際複雜度遠遠小於o v e define typef int type of flow defin...