码迷,mamicode.com
首页 > 其他好文 > 详细

增广路径求解最大流

时间:2016-09-17 00:17:18      阅读:386      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

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++)//bfs
26         {
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

 

增广路径求解最大流

标签:

原文地址:http://www.cnblogs.com/zhenzhenhuang/p/5877566.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!