标签:流量 控制 最大 深度 min amp 指针 lin star
转自https://www.cnblogs.com/rmy020718/p/9546071.html
int deep[N+1]; int q[N+1]= {0},h,t; int cur[N+1]; bool bfs(int S,int T) { for (int i=0; i<=n; i++) deep[i]=0; //初始化深度为0 h=t=1; q[1]=S; deep[S]=1; while (h<=t) { for (int i=lin[q[h]]; i; i=e[i].next) if (!deep[e[i].y]&&e[i].v) //若未计算过深度且这条边不能是空的 { q[++t]=e[i].y; //入队一个节点 deep[q[t]]=deep[q[h]]+1; //计算深度 } ++h; } if (deep[T]) return true; else return false; } int dfs(int start,int T,int minf) { if (start==T) return minf; //若到了汇点直接返回前面流过来的流量 int sum=0,flow=0; for (int &i=cur[start]; i; i=e[i].next) //当前弧优化,运用指针在修改i的同时,将cur[start]顺便修改 if (e[i].v&&deep[start]+1==deep[e[i].y]) { flow=dfs(e[i].y,T,min(minf,e[i].v)); //继续找增广路 if (!flow) deep[e[i].y]=0; //去掉已经增广完的点 sum+=flow; //统计最大流 minf-=flow; //剩余容量 e[i].v-=flow; e[i^1].v+=flow; //更新剩余容量 if (!minf) return sum; //若前面已经流完了,直接返回 } return sum; //返回最大流量 } int maxflow(int S,int T) { int sum=0,minf; while (1) //while(1) 控制循环 { if (!bfs(S,T)) return sum; //bfs求出分层图,顺便判断是否有增广路 for (int i=1; i<=n; i++) cur[i]=lin[i]; //当前弧的初始化 minf=dfs(S,T,INF); //dfs求出流量 if (minf) sum+=minf; //若流量不为0,加入 else return sum; //流量为0,说明没有增广路,返回最大流 } }
标签:流量 控制 最大 深度 min amp 指针 lin star
原文地址:https://www.cnblogs.com/AAAzhuo/p/12242365.html