網路流的初步應用 USACO4 2 草地排水

2021-08-07 05:39:54 字數 1885 閱讀 8461

對於一道網路流的初級問題來說,使用dinic演算法未免有些小題大 做,現在我們使用廣搜的辦法求解該題,在此之前我們首先需要了解一下解決此網路流問題需要的基本定義。

定義

增廣路徑:可以理解為從源點s到匯點t的一條流量不為0的路徑,在這裡我們不考慮負流量的情況

殘餘流量:即當前路徑下容量減去當前流量的值

首先,對於乙個有向圖,若不需直接求出兩點之間的最大流量,我們可以考慮使用鄰接表儲存。否則使用鄰接矩陣則較為方便。想要求出最大流量,我們可以不停的使用廣搜尋找出可行的增廣路徑,對於當前搜尋的增廣路徑上的每乙個節點,每次對它所可以抵達的每乙個點進行擴充套件,同時記錄下該節點的前乙個節點,這個擴充套件需要被擴充套件的點與當前節點上聯通的路徑的殘餘流量為正。當當前節點已經抵達目標節點時,即已經找到了一條可行的增廣路徑,則可以更新一下最優值。注意:當更新的時候,一定要給當前的流量的反向弧加上與它相等的容量。

例如:

f[u][v] = 10
則需要加上乙個反向容量

c[v][u] += 10;
具體的看下面**實現:

#include 

#include

#include

#include

#include

#define rep(i, n, m) for(register int i = n; i <= m; i++)

const

int maxn = 200 + 10;

const

int inf = 0x3f3f3f3f;//定義inf最大值,以便比較求出最小值

using

namespace

std;

queue

q;//佇列以進行廣搜

int capacity[maxn][maxn]/*訪問兩點間的容量*/,

flow[maxn][maxn]/*訪問兩點間的流量*/, previous[maxn];

bool signq[maxn];//標記進行判重

int n, m, bottlenneck, cnt;

inline

void in();//輸入函式

inline

bool search_augmenting_path();//求取增廣路是否存在

inline

void search_augmenting_path_bottlenneck();

//求取當前增廣路上最大的流量,即殘存網路下的最大流量,也即剩餘的容量最小值

inline

void calc_flow();//對當前增廣路上的流量進行統計

inline

void out();//輸出

int main()

out();

return0;}

inline

void in()

}inline

bool search_augmenting_path()

}q.pop();

}return

false;

//否則返回false,此時沒有增廣路了,需要對最終答案進行統計

}inline

void search_augmenting_path_bottlenneck()

}inline

void calc_flow()

}inline

void out()

cout

<< cnt;

}

網路流初步

問題 最大流問題 假設 把一些物品從結點s 源點 運送到t 匯點 可以從其他結點中轉。1.容量 對於一條邊 u,v 它的物品上限成為容量,記為c u,v 2.流量 實際運送的物品成為流量,記為f u,v 目標 最大化從s點流出的淨流量,即最大化 容量c與流量f滿足3個性質 1.容量限制 對g中的每條...

網路流初步 sap演算法

什麼是網路流?請看下圖 這是乙個有向圖,每一條邊都對應著兩個數值 前面的稱為流量,用f u,v 表示,後面的稱為容量,用c u,v 表示,網路中有兩個特殊的點,源點s和匯點t。一 容量限制,對於所有原圖中的變,均有f u,v c u v 二 反對稱性,為了方便計算,我們定f u,v 和f v u 中...

網路流初步詳解2

網路流初步詳解中大致談了一下最大流的一些演算法,其中dinic是非常重要的,補一句 最大流 最小割。本文包括 1.費用流的概念及基本性質 2.edmonds karp增廣路演算法求費用流 3.一些關於費用流的技巧 4.關於費用流的刷題指南 假設您已經理解了dinic演算法和ek演算法二者之一。對於我...