和之前的那个我也不知道叫啥名字的算法一样,我们也有bfs函数和zg函数。(为了区分我叫他dinic函数)
在bfs()中
为了搞的快一点,我们要找一条短一些的路(???)反正先给每个结点根据bfs到的顺序标记一下深度dep数组。(反正能快嗯对没毛病)别的和之前那个一模一样。(这里有个小小的优化:inque不用惹,用dep标记到过没有就行啦)和inque一样,dep只在bfs前清零,别的时候不要搞他画蛇添足!
代码在这里!
bool bfs()
{
memset(dep,0,sizeof(dep[0])*(n+1));//(n+1)乘在sizeof外面
while(!q.empty()) q.pop();//一定要开在外面! 快!
q.push(S);dep[S]=1;
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=head[x];i!=-1;i=nxt[i])
{
if(w[i]==0) continue;//不许忘!
if(!dep[v[i]])
{
q.push(v[i]);
dep[v[i]]=dep[x]+1;
}
if(v[i]==T) return 1;//一定要先标记dep再return
}
}
return 0;
}
在dinic()中
这里就不大一样咯。首先传进去两个参数(x,flow)结点和流量。rest=表示剩余的流量(函数运行完之后就是剩余的流量)
找和x相邻的结点v,注意一定要判断是否和dep的距离是否差是1!(不然你标记dep有啥p用呢)然后用k存下v用掉的流量(这边要递归,参数看好啊:min(rest,w[i])
rest-=k(当rest<=0时就赶紧撤)不然到最后return 总流量-剩余的rest
代码在这里
int dinic(int x,int flow)
{
if(x==T) return flow;
int rest=flow;
for(int i=head[x];i!=-1;i=nxt[i])
{
if(w[i]==0||dep[v[i]]!=dep[x]+1) continue;//!
int k=dinic(v[i],min(rest,w[i]));//!
if(k)
{
rest-=k;w[i]-=k;w[i^1]+=k;
if(rest==0) return flow;
}
}
return flow-rest;
}