最小費用最大流問題

2021-08-04 21:20:50 字數 2373 閱讀 5698

基於網路最大流問題,進一步提出的最小費用問題,費用權值和最大流問題的容量限制是兩個概念,實質上這個問題就是求圖的加權最短路,只是要在最大流的前提下實現。所以要用bellman-ford演算法找增廣路的同時計算最小費。

下面是紫書中求最小費最大流的模板`

const

int maxn = 2000 + 10;

const

int inf = 1000000000;

struct edge

};struct mcmf

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

bool bellmanford(int s, int t, int flow_limit, int& flow, int& cost) }}

}if(d[t] == inf) return

false;

flow += a[t];

cost += d[t] * a[t];

for(int u = t; u != s; u = edges[p[u]].from)

return

true;

} // 需要保證初始網路中沒有負權圈

int mincostflow(int s, int t, int flow_limit, int& cost)

};

還有一道題目

使用的是拆點法:把2~v-1的每個點都拆成i和i』兩個,然後i和i』間連乙個容量1,費用為0的邊,最後限制最大流為2時的最小費用即可。

拆解的辦法:對點2~n-1拆成弧i->i』,前者(節點)編號為1~n-2,後者編號為n~2n-3

for(int i = 2; i <= n-1; i++)

t.addedge(i-1, i+n-2, 1, 0);

對於 flow += a[t]的a[t]要做個限幅,最大流量不能超過2要保證計算出的最小費用是在流量為2的前提下

while(flow < flow_limit && bellmanford(s, t, flow_limit, flow, cost));

完整**如下:

// uva1658.cpp : 定義控制台應用程式的入口點。

//#include

#include

#include

#include

using

namespace

std;

#define inf 1000000000

const

int maxn = 2005;

struct edge//建構函式

};struct mincmaxf

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

bool bellmanford(int s, int t, int flow_limit, int &flow, long

long &cost)}}

}if (d[t] == inf)return

false;

//這句在本題中可要可不要,要了更嚴謹一些

//if (flow + delta[t] > flow_limit) delta[t] = flow_limit - flow;

flow += delta[t];

cost += (long

long)d[t] * (long

long) delta[t];//求出當前費用

for (int u = t; u != s; u = edges[p[u]].from)//回溯

return

true;

}int mincostmaxflow(int s, int t, int flow_limit,long

long &cost)

};int main()

t.mincostmaxflow(0, n-1, 2,mincost);

cout

<< mincost << endl;

}return

0;}

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

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

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

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

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

最小費用最大流 修改的dijkstra ford fulksonff演算法 修改的dijkstra其實和johnson演算法的思想是一致的。乙個求最小費用最大流的樸素演算法是這樣的 1求最小費用增廣路2判斷是否存在增廣路,否的話演算法終止。3增加增廣路上邊的流量4在增廣路上新增必要的逆向負權邊5go...