void addedge(int u,int v,int c)
{
e[cnt].v=v;
e[cnt].c=c;
e[cnt].next=head[u];
head[u]=cnt++;
e[cnt].v=u;
e[cnt].c=0;
e[cnt].next=head[v];
head[v]=cnt++;
}
int dfn[3000];
bool bfs()
{
memset(dfn,-1,sizeof(dfn));
queue<int> q;
int u,v,w;
dfn[S]=0;
q.push(S);
while(!q.empty())
{
u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=e[i].next)
{
v=e[i].v;
if(dfn[v]==-1&&e[i].c>0)
{
dfn[v]=dfn[u]+1;
q.push(v);
}
}
}
if(dfn[T]==-1)
return 0;
return 1;
}
int dfs(int u,int cflow)
{
int uu=cflow;
if(u==T) return cflow;
for(int i=head[u];i!=-1;i=e[i].next)
{
int v=e[i].v;
if(dfn[v]!=dfn[u]+1||e[i].c==0) continue;
int tt=dfs(v,min(e[i].c,uu));
uu-=tt;
e[i].c-=tt;
e[i^1].c+=tt;
}
return cflow-uu;
}
int maxflow()
{
int ans=0,flow;
while(bfs())
{
while(flow=dfs(S,inf))
{
ans+=flow;
}
}
return ans;
}
dinic 模板
最新推荐文章于 2021-04-25 17:31:35 发布