#pragma once
// This file is a fork of AtCoder Library.#define E6NLAQ_MAXFLOW_HPP
#include<algorithm>
#include<cassert>
#include<limits>
#include<vector>#include"internal/queue.hpp"namespacee6nlaq{template<classCap>structmf_graph{public:mf_graph():_n(0){}explicitmf_graph(intn):_n(n),g(n){}intadd_edge(intfrom,intto,Capcap){assert(0<=from&&from<_n);assert(0<=to&&to<_n);assert(0<=cap);intm=int(pos.size());pos.push_back({from,int(g[from].size())});intfrom_id=int(g[from].size());intto_id=int(g[to].size());if(from==to)to_id++;g[from].push_back(_edge{to,to_id,cap});g[to].push_back(_edge{from,from_id,0});returnm;}structedge{intfrom,to;Capcap,flow;};edgeget_edge(inti){intm=int(pos.size());assert(0<=i&&i<m);auto_e=g[pos[i].first][pos[i].second];auto_re=g[_e.to][_e.rev];returnedge{pos[i].first,_e.to,_e.cap+_re.cap,_re.cap};}std::vector<edge>edges(){intm=int(pos.size());std::vector<edge>result;for(inti=0;i<m;i++){result.push_back(get_edge(i));}returnresult;}voidchange_edge(inti,Capnew_cap,Capnew_flow){intm=int(pos.size());assert(0<=i&&i<m);assert(0<=new_flow&&new_flow<=new_cap);auto&_e=g[pos[i].first][pos[i].second];auto&_re=g[_e.to][_e.rev];_e.cap=new_cap-new_flow;_re.cap=new_flow;}Capflow(ints,intt){returnflow(s,t,std::numeric_limits<Cap>::max());}Capflow(ints,intt,Capflow_limit){assert(0<=s&&s<_n);assert(0<=t&&t<_n);assert(s!=t);std::vector<int>level(_n),iter(_n);internal::simple_queue<int>que;autobfs=[&](){std::fill(level.begin(),level.end(),-1);level[s]=0;que.clear();que.push(s);while(!que.empty()){intv=que.front();que.pop();for(autoe:g[v]){if(e.cap==0||level[e.to]>=0)continue;level[e.to]=level[v]+1;if(e.to==t)return;que.push(e.to);}}};autodfs=[&](autoself,intv,Capup){if(v==s)returnup;Capres=0;intlevel_v=level[v];for(int&i=iter[v];i<int(g[v].size());i++){_edge&e=g[v][i];if(level_v<=level[e.to]||g[e.to][e.rev].cap==0)continue;Capd=self(self,e.to,std::min(up-res,g[e.to][e.rev].cap));if(d<=0)continue;g[v][i].cap+=d;g[e.to][e.rev].cap-=d;res+=d;if(res==up)returnres;}level[v]=_n;returnres;};Capflow=0;while(flow<flow_limit){bfs();if(level[t]==-1)break;std::fill(iter.begin(),iter.end(),0);Capf=dfs(dfs,t,flow_limit-flow);if(!f)break;flow+=f;}returnflow;}std::vector<bool>min_cut(ints){std::vector<bool>visited(_n);internal::simple_queue<int>que;que.push(s);while(!que.empty()){intp=que.front();que.pop();visited[p]=true;for(autoe:g[p]){if(e.cap&&!visited[e.to]){visited[e.to]=true;que.push(e.to);}}}returnvisited;}private:int_n;struct_edge{intto,rev;Capcap;};std::vector<std::pair<int,int>>pos;std::vector<std::vector<_edge>>g;};}// namespace e6nlaq
#line 2 "include/e6nlaq/maxflow.hpp"
// This file is a fork of AtCoder Library.#define E6NLAQ_MAXFLOW_HPP
#include<algorithm>
#include<cassert>
#include<limits>
#include<vector>#line 2 "include/e6nlaq/internal/queue.hpp"
// This file is a fork of AtCoder Library.#define E6NLAQ_INTERNAL_QUEUE_HPP
#line 8 "include/e6nlaq/internal/queue.hpp"
namespacee6nlaq{namespaceinternal{template<classT>structsimple_queue{std::vector<T>payload;intpos=0;voidreserve(intn){payload.reserve(n);}intsize()const{returnint(payload.size())-pos;}boolempty()const{returnpos==int(payload.size());}voidpush(constT&t){payload.push_back(t);}T&front(){returnpayload[pos];}voidclear(){payload.clear();pos=0;}voidpop(){pos++;}};}// namespace internal}// namespace e6nlaq#line 13 "include/e6nlaq/maxflow.hpp"
namespacee6nlaq{template<classCap>structmf_graph{public:mf_graph():_n(0){}explicitmf_graph(intn):_n(n),g(n){}intadd_edge(intfrom,intto,Capcap){assert(0<=from&&from<_n);assert(0<=to&&to<_n);assert(0<=cap);intm=int(pos.size());pos.push_back({from,int(g[from].size())});intfrom_id=int(g[from].size());intto_id=int(g[to].size());if(from==to)to_id++;g[from].push_back(_edge{to,to_id,cap});g[to].push_back(_edge{from,from_id,0});returnm;}structedge{intfrom,to;Capcap,flow;};edgeget_edge(inti){intm=int(pos.size());assert(0<=i&&i<m);auto_e=g[pos[i].first][pos[i].second];auto_re=g[_e.to][_e.rev];returnedge{pos[i].first,_e.to,_e.cap+_re.cap,_re.cap};}std::vector<edge>edges(){intm=int(pos.size());std::vector<edge>result;for(inti=0;i<m;i++){result.push_back(get_edge(i));}returnresult;}voidchange_edge(inti,Capnew_cap,Capnew_flow){intm=int(pos.size());assert(0<=i&&i<m);assert(0<=new_flow&&new_flow<=new_cap);auto&_e=g[pos[i].first][pos[i].second];auto&_re=g[_e.to][_e.rev];_e.cap=new_cap-new_flow;_re.cap=new_flow;}Capflow(ints,intt){returnflow(s,t,std::numeric_limits<Cap>::max());}Capflow(ints,intt,Capflow_limit){assert(0<=s&&s<_n);assert(0<=t&&t<_n);assert(s!=t);std::vector<int>level(_n),iter(_n);internal::simple_queue<int>que;autobfs=[&](){std::fill(level.begin(),level.end(),-1);level[s]=0;que.clear();que.push(s);while(!que.empty()){intv=que.front();que.pop();for(autoe:g[v]){if(e.cap==0||level[e.to]>=0)continue;level[e.to]=level[v]+1;if(e.to==t)return;que.push(e.to);}}};autodfs=[&](autoself,intv,Capup){if(v==s)returnup;Capres=0;intlevel_v=level[v];for(int&i=iter[v];i<int(g[v].size());i++){_edge&e=g[v][i];if(level_v<=level[e.to]||g[e.to][e.rev].cap==0)continue;Capd=self(self,e.to,std::min(up-res,g[e.to][e.rev].cap));if(d<=0)continue;g[v][i].cap+=d;g[e.to][e.rev].cap-=d;res+=d;if(res==up)returnres;}level[v]=_n;returnres;};Capflow=0;while(flow<flow_limit){bfs();if(level[t]==-1)break;std::fill(iter.begin(),iter.end(),0);Capf=dfs(dfs,t,flow_limit-flow);if(!f)break;flow+=f;}returnflow;}std::vector<bool>min_cut(ints){std::vector<bool>visited(_n);internal::simple_queue<int>que;que.push(s);while(!que.empty()){intp=que.front();que.pop();visited[p]=true;for(autoe:g[p]){if(e.cap&&!visited[e.to]){visited[e.to]=true;que.push(e.to);}}}returnvisited;}private:int_n;struct_edge{intto,rev;Capcap;};std::vector<std::pair<int,int>>pos;std::vector<std::vector<_edge>>g;};}// namespace e6nlaq