網路流最大流

2022-05-03 10:57:20 字數 2563 閱讀 9103

源點:起始點

匯點:目標點

流:從源點到匯點的一條路徑

容量:每條管道允許通過的最大流量

流量:通過一條邊的水的實際體積

最大流等於最小割

從起點到終點的一條路徑

尋找從s到t的一條增廣路:

在紅色的路線裡,路徑的一條最小流量是3,那麼這條路徑上的邊都減去3,同時反向邊加上3

這條增廣路的乙個流量是3

傳送門\(o(n^2m)\)

不斷地進行尋找從起點到終點的一條增廣路

這條路上的邊都減去這條增廣路上的最小流量

同時按照水流平衡,反向邊加上最小流量

直到沒有增廣路為止,最大流就是所有尋找增光路時得到最小流量之和

#include #include #include #define ll long long

using namespace std;

const int n = 200 + 5;

const int m = 5e3 + 5;

int n, m, s, t;

struct edgee[m << 1];

int head[n], tot = 1;

void add(int u, int v, int w)

bool vis[n];

int dfs(int u, int flow)}}

return 0;

}ll ff()

return max_flow;

}int main()

printf("%lld\n", ff());

return 0;

}

時間複雜度\(o(n^2m)\)

可以看成常數很大的\(o(nm)\)

在ff演算法基本上進行分層進行多路增光

按照ff演算法思維

但首先進行bfs,得到起點出發到終點的乙個分層情況。

然後在dfs時,只需要按照分層的路徑走即可

同時在dfs時,如果說乙個點到不了終點或無增廣路,那麼可以用分層的dis把結果這個點的路徑進行切斷,從而進行優化

dfs那也可以優化,搜尋的次數越多,增廣路的個數越少,所以可以到達終點就直接返回

#include #include #include #include #define ll long long

using namespace std;

const int n = 200 + 5;

const int m = 5e3 + 5;

int n, m, s, t;

struct edgee[m << 1];

int head[n], tot = 1;

void add(int u, int v, int w)

int dis[n];

int dfs(int u, int flow)

}if(!sum) dis[u] = 0; //結果u無法到達終點,或者沒有增廣路,切斷經過這個點的路徑

return sum;

}bool bfs()}}

return dis[t];

}ll dinic()

int main()

printf("%lld\n", dinic());

return 0;

}

每次進行bfs後,都是會從起點出發,如果說通過一條增廣路時上的某個點還能得到一條增廣路,那麼進行dfs時路從該點出發而不是從起點出發。而且,對於乙個點的有些邊,如果流量不滿足,但是dfs還是會去判斷這些邊,用還可以弧優化跳過一些無用的邊。

從而進行弧優化

按照dinic演算法

建立乙個cur[i]陣列,表示從第i個點出發

#include #include #include #include #define ll long long

using namespace std;

const int n = 200 + 5;

const int m = 5e3 + 5;

int n, m, s, t;

struct edgee[m << 1];

int head[n], tot = 1, cur[n]; //弧優化

void add(int u, int v, int w)

int dis[n];

int dfs(int u, int flow)

}if(!sum) dis[u] = 0;//結果u無法到達終點,或者沒有增廣路,切斷經過這個點的路徑

return sum;

}bool bfs()}}

return dis[t];

}ll dinic()

int main()

printf("%lld\n", dinic());

return 0;

}

網路流 最大流

網路流 題記 網路流是最近講過的最迷演算法 網路流 network flows 是一種模擬水流的解決問題方法,與線性規劃密切相關。非常重視選手在網路流上的建模技巧,畫圖是非常關鍵的。1 最大流 問題引入 有n條溝渠,與水坑s t相連,匯聚成m個點,第i條溝渠的水流的流量為c i 每乙個點的流入量和流...

網路流(最大流)

我們圍繞一道題來講解吧 藍橋杯 演算法訓練 網路流裸題 首先,何為網路流最大流問題?可行流 對於每條路線 u,v 上給定乙個實數f u,v 滿足 0 f u,v c u,v 則稱f u,v 為路線 u,v 的流量。而對於一組具有源點和匯點,且總流出量 總流入量,則稱為網路中的一條可行流。拿例子來說 ...

網路流 最大流

dinic 最大流 head x 從0開始記 這樣便於找反向邊 異或即可 當前弧優化 include include include include include include include define ll long long define ull unsigned long long d...