const int N = 1e3, M = 1e5;
struct Node {
int u, v, w, c;
int next;
}edge[M];
int tot, S, T;
int head[N], pre[N], path[N], dis[N], q[N];
bool inq[N];
void init()
{
tot = 0;
memset(head, -1, sizeof(head));
}
void add(int u, int v, int w, int c)
{
edge[tot].u = u; edge[tot].v = v;
edge[tot].w = w; edge[tot].c = c;
edge[tot].next = head[u]; head[u] = tot++;
edge[tot].u = v; edge[tot].v = u;
edge[tot].w = 0; edge[tot].c = -c;
edge[tot].next = head[v]; head[v] = tot++;
}
bool spfa()
{
memset(inq, 0, sizeof(inq));
memset(dis, 0x3f, sizeof(dis));
//memset(pre, -1, sizeof(pre));
dis[S] = 0; inq[S] = true;
int fron = 0, rear = 0;
q[rear++] = S;
while(fron < rear) {
int u = q[fron%N]; fron++;
inq[u] = false;
for(int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].v;
if(edge[i].w > 0 && dis[v] > dis[u] + edge[i].c) {
dis[v] = dis[u] + edge[i].c;
pre[v] = u; path[v] = i;
if(!inq[v]) {
inq[v] = true;
q[rear%N] = v; rear++;
}
}
}
}
return dis[T] < INF;
}
int EK()
{
int ret = 0, flow = 0;
while(spfa()) {
int mini = INF;
for(int i = T; i != S; i = pre[i]) {
mini = min(mini, edge[path[i]].w);
}
for(int i = T; i != S; i = pre[i]) {
edge[path[i]].w -= mini;
edge[path[i]^1].w += mini;
}
ret += mini * dis[T];
flow += mini;
}
return ret;
}
void build();
int main()
{
init();
build();
int ans = EK();
return 0;
}
费用流模板 spfa+EK
最新推荐文章于 2022-06-23 17:59:42 发布