int dinic_d[maxn];
bool dinic_vis[maxn];
struct edge{
int v,next,c;
}e[maxe];
int head[maxn],tol , s , t;
void dinic_init(){
tol=0;
memset(head,-1,sizeof head);
}
void AddEdge(int u,int v,int c)
{
e[tol].v=v,e[tol].c=c,e[tol].next=head[u],head[u]=tol++;
e[tol].v=u,e[tol].c=0,e[tol].next=head[v],head[v]=tol++;
}
bool bfs(){
memset(dinic_d,0,sizeof dinic_d);
memset(dinic_vis,0,sizeof dinic_vis);
queue<int> q;
q.push(s);
dinic_vis[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(e[i].c&&!dinic_vis[v]){
dinic_vis[v]=1;
dinic_d[v]=dinic_d[u]+1;
q.push(v);
}
}
}
return dinic_vis[t];
}
int dfs(int x,int pf){
if(x==t) return pf;
else{
int ret=0;
for(int i=head[x];i!=-1&&pf;i=e[i].next){
int v=e[i].v;
if(e[i].c&&dinic_d[v]==dinic_d[x]+1){
int d=dfs(v,min(e[i].c,pf));
e[i].c-=d;
e[i^1].c+=d;
pf-=d;
ret+=d;
}
}
if(!ret) dinic_d[x] = -2;
return ret;
}
}
int dinic(){
int ret=0;
while(bfs()){
ret+=dfs(s,INF);
}
return ret;
}
dinic 模板
最新推荐文章于 2020-12-01 20:09:47 发布