首页 > 代码库 > 增广路径求解最大流

增广路径求解最大流

关于什么是最大流。我说不清楚,而且也没有别人的比喻生动。

【主要是我懒,不想画图】

算法的核心在于:找到增广路径,修改它,继续找,直到没有。

While ( findAugmentPath() ) // 判断是否有增广路	maxFlow = maxFlow + delta // 最大流增加	modifyGraph() // 对增广路进行修改End While

最近智商有点不够用。想了很久才想通findAugmentPath()函数。
利用的是BFS。
技术分享
 1 int i,j,u,v; 2     int flag=0; 3     for(i=0;i<n;i++) 4     { 5         queue[i]=0;//bfs算法的队列 6         visited[i]=0;//是否被访问 7         path[i]=0;//保存走过的路 8         capacity[i]=0;//最大流 9     }//初始化10     int tail=0;//tail标记此时bfs到哪个地方了11     queue[tail]=0;12     capacity[0]=inf;13     visited[0]=1;14     i=0;15     while(i<=tail)16     {17         u=queue[i];18         if(u==n-1)//如果目的点入队说明存在增广路径19         {20             flag=1;21             return capacity[n-1];22             23         }24             25         for(v=0;v<n;v++)//bfs26         {27             if(r[u][v]>0&&r[u][v]!=inf&&visited[v]==0)28                 {29                     //cout<<v<<endl;30                     path[v]=u;31                     capacity[v]=min(r[u][v],capacity[u]);32                     visited[v]=true;33                     tail=tail+1;34                     queue[tail]=v;35                 }36             37         }38         i++;39     }
View Code

我在想如果只是需要找到一条增广路径,然后修改它,dfs算法也可以。【于是给自己挖了一个坑】

对增广路径的修改,就是找到了某一个路径的最大流,然后经过的路径全部减去这个最大流,意思是下次这里不通了。

技术分享
 1 void modifyGraph() 2 { 3     int flow=capacity[n-1]; 4     int now=n-1; 5     while(now!=0) 6     { 7         int fa=path[now]; 8         r[fa][now]=r[fa][now]-flow; 9     //    r[now][fa]=r[now][fa]+flow;10         now=fa;11             12     } 13 }
View Code

 

增广路径求解最大流