最小費用流問題是尋找流為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...