基於網路最大流問題,進一步提出的最小費用問題,費用權值和最大流問題的容量限制是兩個概念,實質上這個問題就是求圖的加權最短路,只是要在最大流的前提下實現。所以要用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...