源點:起始點
匯點:目標點
流:從源點到匯點的一條路徑
容量:每條管道允許通過的最大流量
流量:通過一條邊的水的實際體積
最大流等於最小割
從起點到終點的一條路徑
尋找從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...