不能过洛谷的模板..
dicnic思路 先bfs一次建立层次图,在层次图上进行dfs找出所有的增广路并进行增广.然后继续bfs,dfs直到bfs不能建立层次图(没有增广路了)
struct Edge{
int from,to,cap,flow;
};
struct Dinic{
int n,m,s,t;
vector<Edge> edges;vector<int> G[maxn];
bool vis[maxn];int d[maxn],cur[maxn];
void init(int n){
for(int i=0;i<n;i++) G[i].clear();
edges.clear();
}
void addedge(int from,int to,int cap){
edges.push_back((Edge){from,to,cap,0});
edges.push_back((Edge){to,from,0,0});
m=edges.size();G[from].push_back(m-2);G[to].push_back(m-1);
}
bool bfs(){
memset(vis,0,sizeof(vis));
queue<int> Q;Q.push(s);vis[s]=1;d[s]=0;
while(!Q.empty()){
int x=Q.front();Q.pop();
for(int i=0;i<G[x].size();i++){
Edge &e=edges[G[x][i]];
if(!vis[e.to]&&e.cap>e.flow){
vis[e.to]=1;
d[e.to]=d[x]+1;
Q.push(e.to);
}
}
} return vis[t];
}
int dfs(int x,int a){
if(x==t||a==0) return a;
int flow=0,f;
for(int &i=cur[x];i<G[x].size();i++){
Edge &e=edges[G[x][i]];
if(d[x]+1==d[e.to]&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0){
e.flow+=f;edges[G[x][i]^1].flow-=f;
a-=f;flow+=f;
if(a==0) break;
}
} return flow;
}
int Max_flow(int s,int t){
this->s=s;this->t=t;
int flow=0;
while(bfs()){
memset(cur,0,sizeof(cur));flow+=dfs(s,INF);
} return flow;
}
};