ANiu的Dinic模板
弧优化/自动反向边
const int inf=1<<30;
struct Graph{
static const int M=100010,N=10010;
int dis[N],cur[N],head[N],cnt=-1;
Graph(){
memset(head,-1,sizeof head);
}
struct edge{
int to,val,next;
}e[M<<1];
void _add(int u,int v,int val){
cnt++;
e[cnt].next=head[u];
e[cnt].to=v;
e[cnt].val=val;
head[u]=cnt;
}
void add(int u,int v,int val){
_add(u,v,val);
_add(v,u,0);
}
bool bfs(int s,int t){
queue<int> q;
memset(dis,-1,sizeof dis);
dis[s]=0;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].to;
if(dis[v]==-1&&e[i].val>0){
dis[v]=dis[u]+1;
q.push(v);
}
}
}
return dis[t]!=-1;
}
int dfs(int s,int t,int maxflow){
if(s==t)return maxflow;
int res=0;
for(int& i=cur[s];i!=-1;i=e[i].next){
int v=e[i].to;
if(dis[v]!=dis[s]+1||e[i].val<=0||res>=maxflow)continue;
int f=dfs(v,t,min(e[i].val,maxflow-res));
e[i].val-=f;
e[i^1].val+=f;
res+=f;
}
return res;
}
int Dinic(int s,int t){
int ans=0;
while(bfs(s,t)){
memcpy(cur,head,sizeof head);
ans+=dfs(s,t,inf);
}
return ans;
}
}mode;