1. 程式人生 > >費用流模板——ZKW

費用流模板——ZKW

先讓我們回顧一下SPFA演算法:

設d[x] = x到T的最短距離

對於i,j必有d[j] + c[i][j] >= d[i]

SPFA演算法就是每次找到d[j] + c[i][j] = d[i]的等式,走最短路更新答案。
這樣的話沒有充分利用到已經求過的,有些圖會很慢。

我們可以借鑑KM演算法的思想,每次把d[i]增大一點點,就可以找到範圍更大的j,答案也是對的。每次增高的距離就是已走過點到為走過點的最小高度差,類似於sap。

基礎:


int n, S, T, ans1, ans2; // ans1表示最大流量, ans2表示最小費用。 
int tot = 1, final
[Maxn], dis[Maxn], bz[Maxn]; // dis表示到T的距離。 struct edge { int to, next, r, w; }a[Maxm];

void link(int x,int y,int r,int w) {
    a[++tot].next = final[x], a[tot].to = y, a[tot].r = r, a[tot].w = w, final[x] = tot;
    a[++tot].next = final[y], a[tot].to = x, a[tot].r = 0, a[tot].w = -w, final[y] = tot;
} //前向星加邊

ZKW:

int aug(int x,int flow) {
    if(x == T) {
        ans1 += flow;
        ans2 += dis[S] * flow;
        return flow;
    }
    bz[x] = 1;
    int use = 0;
    for(int i = final[x]; i; i = a[i].next) {
        int y = a[i].to;
        if(!bz[y] && a[i].r && dis[y] + a[i].w == dis[x
]) { int tmp = aug(y, min(a[i].r, flow - use)); a[i].r -= tmp; a[i ^ 1].r += tmp; use += tmp; if(use == flow) return use; } } return use; } bool change() { int minh = INF; fo(i, 1, T) if(bz[i]) for(int k = final[i]; k; k = a[k].next) if(a[k].r && !bz[a[k].to]) minh=min(minh, dis[a[k].to] + a[k].w - dis[i]); if(minh == INF) return 0; fo(i, 1, T) if(bz[i]) dis[i] += minh; return 1; }

相關推薦

費用模板——ZKW

先讓我們回顧一下SPFA演算法: 設d[x] = x到T的最短距離 對於i,j必有d[j] + c[i][j] >= d[i] SPFA演算法就是每次找到d[j] + c[i][j] = d[i]的等式,走最短路更新答案。 這樣的話沒有充分利用到已

ZKW費用 模板

學了這麼多天的zkw費用流,竟然只會最簡單的。。。粘上蒟蒻的模板吧。 bool spfa(){ memset(vis,0,sizeof(vis)); for(int i=0;i<=T;i++)dep[i]=-1; int head=0,tail=1; dep[

zkw費用模板

void insert(int u,int v,int w,int cost) {add(u,v,w,cost); add(v,u,0,-cost);} int spfa() {     memset

ZKW,SPFA費用模板

費用流比較常用的做法有兩種:SPFA費用流和ZKW費用流 兩種費用流的基本做法相同:找到費用最小的路,不斷增廣到不能增廣為止 正確性很顯然,因為每次都找費用最小的路,所以費用一定最小,因為增廣到不能增廣才停止,所以一定是最大流 SPFA 費用流打起來

[轉]從入門到精通: 最小費用的“zkw算法”

值範圍 add turn 所有 運行時 static col sap 上下 >>>> 原文地址:最小費用流的“zkw算法” <<<< 1. 網絡流的一些基本概念 很多同學建立過網絡流模型做題目, 也

最大 最小費用模板

queue || bfs () const mes 最大流 amp -a 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include

網路&費用模板

網路流&費用流模板 最大流 struct edge{ int to,val,next; }e[]; int cnt_edge,last[],cur[],dis[]; inline void add_edge(int u,int v,int w){ e[++

費用模板——EK+SPFA實現的最小費用最大

演算法原理 用兩個字的高度概括——貪心~ 用一句話的概括:每一次通過spfa找到花費最小的可行流,然後進行增廣,直到殘量網路中,源點不能達到匯點。 其實還是通過程式碼理解比較好。 code 這裡1是源點,n是匯點。 每次的讀入四個數:有向邊的兩個

[ACM模板]ZKW MCMF費用

#include <cstdio> #include <cstring> #include<vector> #include <iostream> using namespace std

Farm Tour(最小費用最大模板)

arc cost -c fields ros lap view which accept Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18150

最大 && 最小費用最大模板

() 鏈接 處理 article 最大流 最短路徑 cos 一次 bfs 模板從 這裏 搬運,鏈接博客還有很多網絡流題集題解參考。 最大流模板 ( 可處理重邊 ) struct Edge { Edge(){} Edge(int fr

洛谷P3381 【模板】最小費用最大(dijstra費用)

就是 tro fin https copy priority 而不是 ++ printf 題目描述 如題,給出一個網絡圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網絡最大流和在最大流情況下的最小費用。 輸入輸出格式 輸入格式: 第一行包含四

最小費用最大模板 洛谷P3381

truct ron .org src pre ems ons con {} 題目描述 如題,給出一個網絡圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網絡最大流和在最大流情況下的最小費用。 輸入輸出格式 輸入格式: 第一行包含四個正整數N、M

最小費用最大模板理解

//最小費用最大流演算法 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{

[學習筆記] 楊柳 - zkw費用 - 學習筆記

辣雞卡費用流題 題目大意:給你一張有障礙網格圖,n個棋子和n個洞,每次可以移動一枚棋子到(x±a,y±b),(x±b,y±a)的八個位置,不能移出邊界或移動到障礙。問最少幾步能使得每個洞恰好有一個棋子。任意時刻同一位置最多一個棋子。

學習筆記第三十節:zkw費用

正題       這個zkw大神非常6,把兩種很顯然的網路流演算法結合了起來。        zkw費用流=EK費用流+Dinic最大流        對,你沒有看錯。

#網路費用,SLF優化,SPFA,zkw費用#jzoj 1586 codevs 1362 洛谷 2604 網路擴容

題目 有兩個問題,首先求1到nnn的最大流(不解釋了),然後求1到n使最大流擴充套件kkk的費用,每擴充套件一個最大流,擴充套件一次邊的費用 分析 當然如何做第二個問題,可以重新建一個匯點流量是最大流

#zkw費用,最小費用最大#洛谷 4012 codevs 1917 ssl 2620 深海機器人問題

題目大意 在一個平面直角座標系中,機器人只能往右和上採集標本,每個格點都有不同的價值,現在若干個機器人從某點出發目的地為某點,問採集到的最大價值 分析 其實這道題類比於K取方格數,容易建出這樣一張圖 然後跑一遍最大費用最大流就可以了,但是我把費用取反,跑的是最小費用最

#zkw費用,最大費用最大#codevs 1227 洛谷 2045 poj 3422 k取方格數 方格取數加強版

題目 跑 k k k遍方格取數,問能取到的最大價值 分析 按照演算法競賽進階指南,建邊

模板歸納】網路費用

首先是網路流及最小費用最大流的兩種最基礎演算法 這兩種網路流演算法的思想核心都是尋找增廣路+沿增廣路擴充套件新流 首先是Dinic 演算法 使用bfs尋找增廣路,記錄增廣路中節點層數, 而在dfs中沿著層數+1的方向不斷遞推 直到無法再找到新的增廣路為止 程式碼 #include &