#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 1010;
const int inf = 0x3f3f3f3f;
typedef long long ll;
struct edge
{
int from, to, cap, flow, cost;
edge(int u, int v, int c, int f, int w) :from(u), to(v), cap(c), flow(f), cost(w)
{
}
};
struct mcmf
{
int n, m;
vector<edge> edges;
vector<int> g[maxn];
int visit[maxn]; //是否在队列中
int dist[maxn];
int p[maxn]; //上一条弧
int a[maxn]; //可改进的量
void init(int n)
{
this->n = n;
for (int i = 0; i <= n; i++) g[i].clear();
edges.clear();
}
void addedge(int from, int to, int cap, int cost)
{
edges.push_back(edge(from, to, cap, 0, cost));
edges.push_back(edge(to, from, 0, 0, -cost));
m = edges.size();
g[from].push_back(m - 2);
g[to].push_back(m- 1);
}
bool bellmanford(int s, int t, int &flow,int &cost)
{
for (int i = 0; i <= n; i++) dist[i] = inf;
memset(visit, 0, sizeof(visit));
dist[s] = 0; visit[s] = 1; p[s] = 0; a[s] = inf;
queue<int> q;
q.push(s);
while (!q.empty())
{
int u = q.front(); q.pop();
visit[u] = 0;
for (int i = 0; i < (int)g[u].size(); i++)
{
edge e = edges[g[u][i]];
if (e.cap > e.flow&&dist[e.to] > dist[u] + e.cost)
{
dist[e.to] = dist[u] + e.cost;
p[e.to] = g[u][i];
a[e.to] = min(a[u], e.cap - e.flow);
if (!visit[e.to]) q.push(e.to), visit[e.to] = 1;
}
}
}
if (dist[t] == inf) return false;
flow += a[t];
cost += dist[t] * a[t];
for (int i = t; i != s; i = edges[p[i]].from)
{
edges[p[i]].flow += a[t];
edges[p[i] ^ 1].flow -= a[t];
}
return true;
}
int mincostmaxflow(int s, int t, int &cost)
{
int flow = 0; cost = 0;
while (bellmanford(s, t, flow, cost));
return flow;
}
};
最小费用最大流模板
最新推荐文章于 2022-08-22 23:02:01 发布