費用流模板——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 &