ネットの流れ——最小費用の最大フロー
最小費用の最大フローを学ぶ前に、最大ストリームアルゴリズムを学ぶ必要があります.最大ストリームアルゴリズムでは、エッジの費用問題は考慮されていない.MinCostMaxFlowには、費用の概念が導入されている.cijは辺(i,j)単位の流量を表す費用である.流量=v(f)を満足させるとともに、費用が一番少ないことが要求されます.
最小費用の最大ストリームの反復アルゴリズム:
1.sからtまでの最小費用通路(spfa)と通路の最大流量fを求める.
2.通路の端(i,j)の流量にfを引かせる.リバースエッジ(j,i)を追加します.容量はfで、費用は−cost(i,j)です.
3.sからtまでの流量=v(f)またはsからtまでの最小料金道路が見つからないまで、1,2を繰り返します.
最小費用最大ストリームアルゴリズムはまた、二分図の最適整合を解決することができる.
最小費用の最大ストリームテンプレート:
poj 2516 2195を参照してください.
最小費用の最大ストリームの反復アルゴリズム:
1.sからtまでの最小費用通路(spfa)と通路の最大流量fを求める.
2.通路の端(i,j)の流量にfを引かせる.リバースエッジ(j,i)を追加します.容量はfで、費用は−cost(i,j)です.
3.sからtまでの流量=v(f)またはsからtまでの最小料金道路が見つからないまで、1,2を繰り返します.
最小費用最大ストリームアルゴリズムはまた、二分図の最適整合を解決することができる.
最小費用の最大ストリームテンプレート:
const int size = 1102;
const int INF = 0x7fffffff;
struct Edge
{
int to;
int vol;
int cost;
int next;
}e[size*40];
int index[size];
int edgeNum;
int pre[size], pos[size];
int dis[size], que[size*10];
bool vis[size];
void insert(int from, int to, int vol, int cost)
{
e[edgeNum].to = to;
e[edgeNum].vol = vol;
e[edgeNum].cost = cost;
e[edgeNum].next = index[from];
index[from] = edgeNum++;
e[edgeNum].to = from;
e[edgeNum].vol = 0;
e[edgeNum].cost = -cost;
e[edgeNum].next = index[to];
index[to] = edgeNum++;
}
bool spfa(int s, int t)
{
int i;
memset(pre, -1, sizeof(pre));
memset(vis, 0, sizeof(vis));
int head, tail; head = tail = 0;
for(i = 0; i < size; i++)
dis[i] = INF;
que[tail++] = s;
pre[s] = s;
dis[s] = 0;
vis[s] = 1;
while(head != tail)
{
int now = que[head++];
vis[now] = 0;
for(i = index[now]; i != -1; i = e[i].next)
{
int adj = e[i].to;
if(e[i].vol > 0 && dis[now] + e[i].cost < dis[adj])
{
dis[adj] = dis[now] + e[i].cost;
pre[adj] = now;
pos[adj] = i;
if(!vis[adj])
{
vis[adj] = 1;
que[tail++] = adj;
}
}
}
}
return pre[t] != -1;
}
int MinCostFlow(int s, int t, int flow)
{
int i;
int cost = 0;
flow = 0;
while(spfa(s, t))
{
int f = INF;
for(i = t; i != s; i = pre[i])
if (e[pos[i]].vol < f) f = e[pos[i]].vol;
flow += f; cost += dis[t] * f;
for(i = t; i != s; i = pre[i])
{
e[pos[i]].vol -= f;
e[pos[i] ^ 1].vol += f;
}
}
return cost; // flow
}
poj 2516 2195を参照してください.