# FLOW 演算法
- Dinic 演算法
```clike=
struct Dinic{
static const int MXN = 10000;
struct Edge{ int v,f,re; }; // 指向點, 容量, 反向邊的 ID
int n,s,t,level[MXN];
vector<Edge> E[MXN];
void init(int _n, int _s, int _t){
n = _n; s = _s; t = _t;
for (int i=0; i<n; i++) E[i].clear();
}
void add_edge(int u, int v, int f){
E[u].push_back( {v,f,E[v].size()} );
E[v].push_back( {u,0,E[u].size()-1} );
}
// 建構分層圖
bool BFS(){
for (int i=0; i<n; i++) level[i] = -1;
queue<int> que;
que.push(s);
level[s] = 0;
while (!que.empty()){
int u = que.front(); que.pop();
for (auto it : E[u]){
if (it.f > 0 && level[it.v] == -1){
level[it.v] = level[u]+1;
que.push(it.v);
}
}
}
return level[t] != -1;
}
// 在分層圖中,找出一條從 u 出發流量不超過 res_flow 的增廣路
int DFS(int u, int res_flow){
if (u == t) return res_flow;
int res = 0;
for (auto &it : E[u]){
if (it.f > 0 && level[it.v] == level[u]+1){
int tmp = DFS(it.v, min(res_flow, it.f));
res += tmp;
res_flow -= tmp;
it.f -= tmp;
E[it.v][it.re].f += tmp;
if (res_flow == 0) return res;
}
}
if (!res) level[u] = -1;
return res;
}
int flow(){
int res = 0;
while ( BFS() )
res += DFS(s,2147483647);
return res;
}
} flow;
```