bool bfs(int s,int t) //分层
{
int i;
memset(len,-1,sizeof(len));
queue<int>que;
que.push(s);
len[s]=0;
while(!que.empty())
{
int u=que.front();
que.pop();
for(i=0;i<=t;i++)
{
if(map[u][i]>0 && len[i]<0)
{
len[i]=len[u]+1;
que.push(i);
}
}
}
if(len[t]>-1)
return true;
return false;
}
int dfs(int u,int t,int f) //寻找增广路
{
if(u==t)
return f;
for(int &i=pos[u];i<=t;i++) //注意该处的引用,意思就是从上次遍历过的地方开始
{
if(map[u][i]>0 && len[u]<len[i])
{
int d=dfs(i,t,min(map[u][i],f));
if(d>0)
{
map[u][i]-=d;
map[i][u]+=d;
return d;
}
}
}
return 0;
}
int max_flow(int s,int t)
{
int res=0;
while(bfs(s,t))
{
memset(pos,0,sizeof(pos));
while(1)
{
int d=dfs(s,t,99999);
if(d<=0)
break;
res+=d;
}
}
return res;
}
Dinic算法(最大流)
最新推荐文章于 2022-08-27 21:31:09 发布